2011-08-12 125 views
0

我想換我圍繞如何建立這個模式與多態關聯頭:Rails的多態關聯+ fields_for

「文件」有一個元數據對象,但是這可以是「PDFMetaData」或「 TXTMetaData」。

我的擔憂是:

要建立此關聯,我可以做到這一點

class Document 
    belongs_to :metadata, :polymorphic => true 
end 

class PDFMetaData 
    has_one :document, :as => :metadata 
end 

class TXTMetaData 
    has_one :document, :as => :metadata 
end 

這工作,但那種感覺就像反向對我來說:文檔HAS_ONE元數據對象,而不是相反?

此外,我試圖爲我的新文檔創建嵌套表單時遇到問題。我知道我可以使用fields_for,但我怎麼知道它是什麼樣的對象? (PDFMetaData或TXTMetaData)。我必須根據我擁有的文檔類型來呈現單獨的部分嗎?

恐怕後者與我的第一個問題有關係,並且我正在做一些非常錯誤的事情。

感謝

回答

0

雖然我能看到你從有關在這種情況下belongs_to的& HAS_ONE的排列混亂的到來,理由是基於在foreign_key在DB模式。 documents表中包含foreign_key,它將它與PdfMetaData對象相關聯,因此用另一種方式描述關係是沒有意義的,因爲沒有辦法建立has_many關係(如何在1中存儲多個外鍵數據庫行?)

希望這是有道理的......但對第二個問題,解決方案取決於您的TXTMetaDataPDFMetaData類上的有效屬性列表。如果他們有相同的屬性(或者至少你想在你的形式提供的相同的那些),那麼你應該不會介意的

fields_for :metadata do |meta_fields| 
    meta_fields.text_field :attr 
    meta_fields.text_fields :attr2 
end 

然而,如果你希望公開不同的屬性那麼我會建議檢測你的元數據對象的類,並採取相應的行動,例如

meta_obj = document.metadata 
fields_for :metadata, meta_obj do |meta_fields| 
    if meta_obj.is_a?(PDFMetaData) 
    meta_fields.text_field :attr 
    meta_fields.text_fiels :attr2 
    elsif meta_obj.is_a?(TXTMetaData) 
    meta_fields.text_field :other_attr 
    meta_fields.text_fiels :other_attr2 
    end 
end