2010-02-26 84 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:通過關聯,但是我如何在Group上指定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像以前的一個,它總是可以使用單表繼承。這個解決方案取決於你的classes attributes and behavior,但可以讓你使用「has_many through」關聯。

+0

這不適合我實際的工作,因爲我需要將搜索限制在某一特定羣體。對組的引用在連接中是多態的,這使得SQL變得相當複雜。 – wolak 2010-03-01 00:41:45

+1

這實際上受Group限制。請注意,我正在使用已經過濾掉不屬於實際組的項目和personal_blog的「project_ids」和「personal_blog_ids」集合。 – fjuan 2010-03-01 08:57:02

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 2010-02-28 20:20:37

+0

我的不好。這有助於我閱讀整個事情。 – Midwire 2010-03-01 16:09:54