has_many: através de incentivos sobre find_or_initialize_by
-
05-07-2019 - |
Pergunta
Eu tenho um modelo, de alimentação, que tem e pertence a muitos FilteredUsers. Neste caso, eu ter implementado através de um has_many:. Através do relacionamento
class Feed < ActiveRecord::Base
has_many :denials, :dependent => :destroy
has_many :filtered_users, :through => :denials
Eu gostaria de criar um registro se ele não existe ou encontrar o objeto se ele existe. Quando tento usar o find_or_initialize_by (ou find_or_create_by) uma exceção é lançada dizendo undefined method 'feed_id=' for <FilteredUser..
Aqui está o código:
feed = Feed.find(params[:id])
user = feed.filtered_users.find_or_initialize_by_user_url(params[:user_url])
if params[:status] == "block"
feed.filtered_users << user
else
feed.filtered_users.delete(user)
end
feed.save
Todas as sugestões sobre como corrigir isso ou como trabalhar em torno dele secamente?
Obrigado!
Solução
Em primeiro lugar, porque é uma relação has_many :through
, a inicialização não tem nenhuma maneira de saber qual denial
o novo filtered_user
deve ser associado. Se você quiser usar find_or_initialize_by
, você precisa executá-lo em um denial
específico que está associado com o feed
.
Criar uma nova filtered_user e associá-lo com uma negação específica.
Em segundo lugar, concordando com ErsatzRyan, a lógica geral parece um pouco fora.
Outras dicas
Não seria mais fácil para verificar os params [: Status]? Em primeiro lugar e, em seguida, fazer o que você precisa fazer
feed = Feed.find(params[:id])
if params[:status] == 'block'
feed.filtered_users.build(:user_url => params[:user_url])
else
feed.filtered_users.find_by_user_url(params[:user_url]).delete
end
feed.save
Aviso Este ar não codificado testado