2011-08-12 75 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