2010-02-26 60 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