has_many: par l'association à travers deux associations différentes
-
23-09-2019 - |
Question
J'ai quatre classes de modèle:
class Group < ActiveRecord::Base
has_many :projects
has_many :personal_blogs
end
class Project < ActiveRecord::Base
has_many :events, :as => :event_producer
end
class PersonalBlog < ActiveRecord::Base
has_many :events, :as => :event_producer
end
class Event < ActiveRecord::Base
belongs_to :event_producer, :polymorphic => true
end
Je veux trouver tous les événements pour un groupe particulier. Je figure cela est un has_many: par association, mais comment puis-je spécifier un has_many sur le groupe qui trouve tous les événements dans les projets ou personal_blogs d'un groupe? Je pourrais, bien sûr, préciser deux associations et concaténer les résultats, mais je dois trier à nouveau, limite, état, etc. Ruby, ce qui pourrait être un cauchemar de performance avec de nombreux événements. Je voudrais le faire dans ActiveRecord pour éviter un tel cauchemar.
Pas de solution correcte
Autres conseils
Vous pouvez définir une méthode dans la classe comme groupe suivant:
class Group < ActiveRecord::Base
has_many :projects
has_many :personal_blogs
def events
Event.find(:all, :conditions => ['(type = ? AND event_producer_id IN (?)) OR (type = ? AND event_producer IN (?))', 'project', project_ids, 'personal_blog', personal_blog_ids])
end
end
Si vous ne l'aimez pas SQL comme le précédent, il est toujours possible d'utiliser l'authentification unique Héritage de Table. Cette solution dépend de votre attributs et le comportement , mais vous permettra d'utiliser un "has_many par" association.
Pourquoi ne pas simplement faire:
class Group < ActiveRecord::Base
has_many :projects
has_many :personal_blogs
def all_events
projects.events + personal_blogs.events
end
end