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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top