2010-02-26 6 views
2

У меня есть четыре модели класса:has_many: через ассоциацию через два различных ассоциаций

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 

Я хочу найти все события для определенной группы. Я полагаю, что это has_many: через объединение, но как указать has_many в группе, которая находит все события в проектах или personal_blogs группы? Я мог бы, конечно, указать две ассоциации и объединить результаты, но затем мне нужно повторно сортировать, ограничивать, условие и т. Д. В Ruby, что потенциально может быть кошмаром производительности со многими событиями. Я бы хотел сделать это в ActiveRecord, чтобы избежать такого кошмара.

ответ

5

Вы могли бы определить метод в классе группы, как в следующем:

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 

Если вам не нравится SQL, как и предыдущий, это всегда можно использовать Single Table Inheritance. Это решение зависит от вашего classes attributes and behavior, но позволит вам использовать ассоциацию «has_many through».

+0

Это на самом деле не работает для меня, потому что мне нужно ограничить поиск конкретной группы. Ссылка на группу полиморфна через соединение, что делает SQL значительно более сложным. – wolak

+1

Это фактически запрещено Группой. Обратите внимание, что я использую коллекции «project_ids» и «personal_blog_ids», которые уже фильтруют проекты и личные_блоки, которые не принадлежат к фактической группе. – fjuan

0

Почему бы не просто сделать:

class Group < ActiveRecord::Base 
    has_many :projects 
    has_many :personal_blogs 

    def all_events 
    projects.events + personal_blogs.events 
    end 
end 
+0

«Я мог бы, конечно, указать две ассоциации и объединить результаты, но затем мне нужно повторно сортировать, ограничивать, условие и т. Д. В Ruby, что потенциально может быть кошмаром производительности со многими событиями. сделайте это в ActiveRecord, чтобы избежать такого кошмара ». – wolak

+0

мой плохой. это помогает, когда я читаю все это. – Midwire