Rails modèle utilisateur activités has_many (observateur), mais devrait également être observé
-
19-09-2019 - |
Question
Je suis en cours d'exécution dans un problème avec un modèle ActiveRecord::Observer
existant qui enregistre diverses Activities
d'un User
site. Tout fonctionnait très bien, jusqu'à ce que j'essayé de observe
la classe User
avec le même modèle Activity
qu'il utilise pour observe
autres modèles. Considérez que:
class Activity < ActiveRecord::Base
belongs_to :user
belongs_to :item, :polymorphic => true
end
class ActivityObserver < ActiveRecord::Observer
observe :billing, :call, :vanity_number
end
class User < ActiveRecord::Base
has_many :comments
has_many :activities
end
class Comment < ActiveRecord::Base
belongs_to :user
has_many :activities, :as => :item
end
Le ci-dessus a bien fonctionné. Une requête pour User.activities
renverrait lignes de Comment
Activities
. Dès que j'ai ajouté :user
à la méthode observe
dans ActivityObserver
et changé has_many :activities
dans le modèle User
à has_many :activities, :as => :item
, User.activities
ne ferait que renvoyer les lignes qui étaient des activités se rapportant à cette instance de User
et pas tout Comments
Pourquoi est-ce? Que puis-je faire pour obtenir ce travail comme prévu?
La solution
Lorsque vous avez changé
class User < ActiveRecord::Base
has_many :activities
end
à
class User < ActiveRecord::Base
has_many :activities, :as => :item
end
il est maintenant à la recherche sur le terrain de item_id
dans le tableau des activités où le champ de type utilisateur à se retirer des activités où item_id = users.id
. Avant qu'il regardait le champ user_id
des activités. Étant donné que le champ item_id
et sur le terrain de type ne peuvent pas avoir deux valeurs, vous fait en sorte que les points d'une activité à un utilisateur ou un commentaire. Il ne peut pas être à la fois.