2009-12-12 11 views
0

Je rencontre un problème avec un modèle ActiveRecord::Observer existant qui enregistre divers Activities d'un User le site. Tout fonctionnait très bien, jusqu'à ce que j'essaie de observe la classe User avec le même modèle Activity qu'elle utilise pour observe autres modèles. Considérons que:Rails Le modèle d'utilisateur has_many activités (observateur) mais devrait également être observé

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 

Ce qui précède a bien fonctionné. Une requête pour User.activities retournera des lignes de CommentActivities. 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 et Userne aucune Comments

Pourquoi? Que puis-je faire pour que cela fonctionne comme prévu?

Répondre

1

Lorsque vous 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 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, il regardait le champ user_id dans les activités. Étant donné que le champ item_id champ et type ne peut pas avoir deux valeurs, vous l'avez fait pour qu'une activité pointe sur un utilisateur ou un commentaire. Cela ne peut pas être les deux.