2010-08-15 118 views
5

我有一個父對象Post,它有以下子對象。反向多態性關聯

has_one :link 
has_one :picture 
has_one :code 

這些孩子是相互排斥的。

是否有反向使用多態關聯的方法,以便我不必在Post表中使用link_id,picture_id和code_id字段?

+0

讓照片有has_many關係有意義嗎? 然後,你可以做你正在尋找.. – Trip 2010-08-15 15:32:23

回答

0

我相信你在尋找has_one:as選項。它允許你指定belongs_to關聯結束的名稱。

當一切都失敗了,閱讀文檔:http://apidock.com/rails/ActiveRecord/Associations/ClassMethods/has_one

+0

也許我錯過了一些東西,但我將如何創建一個動態的關聯與小孩使用:as? 我瞭解多態關於如何子對象可以有任何類型的父對象。但是我問的是父對象如何可以有任何類型的子對象。 我想做一些類似於@ post.postable的東西,並獲取子對象,這將是鏈接,圖片或代碼之一。 – 2010-08-15 22:25:51

0

有沒有辦法使用反向多態性 協會讓我 不必有link_id, picture_id和code_id領域的方式我的 郵政表?

has_one意味着外鍵是在其他表。如果你真的以這種方式定義你的模型,那麼你的Post表中就不會有link_id,picture_idcode_id。我想你的意思是說belongs_to

我要像做 @ post.postable並得到孩子 對象,這將是環節之一, 圖片或代碼。

我相信你可以使用STI和結合linkspicturescodes表,然後檢索時測試模型的類型,做到這一點。這似乎kludgey雖然,並可能結束了大量未使用的列。

是否有沒有存儲未使用的id列,而不是節省空間的原因?如果你願意讓他們,那麼你可以定義一個虛擬屬性和postable_type柱:(未經測試的代碼,可壯觀失敗)

def postable 
    self.send(self.postable_type) 
end 

def postable=(p) 
    self.send(postable_type.to_s+"=",p) 
end 
+0

我只是尋找一種比多個* _id列更優雅的方式。雖然當這個線程被證明,多個* _id列方法可能是最簡單和最好的。 – 2010-08-20 16:34:06