2011-11-01 85 views
2

我有以下型号设置:如何通过多态类型获取对象的所有实例?

class Sound < ActiveRecord::Base 
    has_many :tenders, :as => :tenderable 
    belongs_to :event 
end 

class Stage < ActiveRecord::Base 
    has_many :tenders, :as => :tenderable 
    belongs_to :event 
end 

class Tender < ActiveRecord::Base 
    attr_accessible :event_id, :user_id, :estimate, :tenderable_id, :tenderable_type 
    belongs_to :tenderable, :polymorphic => :true 
end 

class Event < ActiveRecord::Base 
    attr_accessible :name 
    has_one :stage 
    has_one :sound 

    accepts_nested_attributes_for :stage, :allow_destroy => true 
    accepts_nested_attributes_for :sound, :allow_destroy => true 
end 

每个事件的各种Tenderable的连接到它(如舞台,音响),我可以通过Event.find(ID).tenderables访问这些,但我需要确定哪些“机会”可用,而不管他们所附的事件如何。

目前,我没有对“机会”的模型,因为我试图让事情变得简单。

真的是我想要做的是一样的东西Tenderables.all将返回所有的“声音”,“阶段”和其他任何我定义为“tenderable”。

达到此目的的最佳方法是什么?

感谢;)

+0

你想找到所有'Tenderables'有一个'Tender'或者那些可能得到一个'Tender'所有对象(因为这将只是所有'阶段,声音,...')。 – nathanvda

+0

嗨Nathanvda - 我需要所有可能会招标的物件。 'tenderables'阶段,声音......列表可能会经常发生变化...... – significance

回答

2
Tender.select("DISTINCT tendable_type").collect(&:tendable_type).compact 

会给你已经至少使用过一次所有相关型号的名称。

对于那些已经被关联作为tendable

Tender.where("tendable_type IS NOT NULL").collect(&:tendable) 
+2

当我阅读它时,OP不在寻找模型名称,而是寻找对象。 – nathanvda

+0

您的权利,我更新后,以适应OP的要求 – davidb

+0

谢谢大卫 - 这将非常方便! – significance

2

据我所知所有Tenderables的名单中,事情会连有一个Tender含义所有对象,是不可能从数据库建立或模型结构。在数据库中,你将能够找到所有Tenderable具有连接到它Tender,但不是一个简单的方法(想查询的联盟各tenderable_type)。

但多态关系的基本属性实际上是任何类型的对象可以连接到它,所以你必须要管理,可以自己有一个温柔的对象的完整列表。

我不完全确定你为什么要这样做,但你必须做一个Sound.allStage.all的联合,以及任何表格将在晚些时候调用。

现在写这个的时候,我想到的是:要能做到工会,这些表必须非常相似。如果他们是,您的情况,您可能需要引入Tenderable对象为真实,并使用STI。对于你现在想要的,这将是最好的解决方案。

不管是什么Tenderable都必须放在一张表中,并带有一个类型(Sound,Stage,...),然后才能与Tenderable获得正常关系。阶段或声音从Tenderable继承。然后您可以轻松地选择所有可录音材料,或单独选择所有声音/平台。

希望这会有所帮助。

+0

我已经标记大卫的答案是正确的,因为它可能更多地用于其他用户 - 这一个对我的理解虽然是最有用的!非常感谢!:) – significance

+0

无需解释:您可以定义哪个答案效果最好,其他用户也会决定(通过投票选出他们最喜欢的问题)。 – nathanvda

相关问题