Question

J'ai un modèle, Feed, qui appartient à de nombreux utilisateurs Filtered. Dans ce cas, je l'ai implémenté via une relation has_many: through.

class Feed < ActiveRecord::Base
  has_many :denials, :dependent => :destroy
  has_many :filtered_users, :through => :denials

J'aimerais créer un enregistrement s'il n'existe pas ou trouver l'objet s'il existe. Lorsque j'essaie d'utiliser find_or_initialize_by (ou find_or_create_by), une exception est levée en indiquant undefined method 'feed_id=' for <FilteredUser..

Voici le code:

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

Avez-vous des suggestions pour résoudre ce problème ou comment le contourner à sec?

Merci!

Était-ce utile?

La solution

Premièrement, comme il s’agit d’une relation has_many :through, l’initialisation n’a aucun moyen de savoir à denial lequel le nouveau filtered_user doit être associé. Si vous souhaitez utiliser find_or_initialize_by, vous devez l'exécuter sur un feed spécifique associé au <=>.

.

Construisez un nouvel utilisateur filtré et associez-le à un refus spécifique.

Deuxièmement, en accord avec ErsatzRyan, la logique générale semble un peu décalée.

Autres conseils

Ne serait-il pas plus facile de vérifier d'abord les paramètres [: status], puis de faire ce que vous devez faire?

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

avertissement, cela signifie que le code de l'air n'est pas testé

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top