has_many: par des pauses sur find_or_initialize_by
-
05-07-2019 - |
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!
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é