2011-11-01 31 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

相關問題