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!

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top