Ruby on rails Rails多态关联&x2B;字段
我正试图了解如何使用多态关联设置此模式: “文档”有一个元数据对象,但可以是“PDFMetaData”或“txtmata” 我关注的是: 为了建立这个协会,我可以这样做Ruby on rails Rails多态关联&x2B;字段,ruby-on-rails,forms,polymorphism,Ruby On Rails,Forms,Polymorphism,我正试图了解如何使用多态关联设置此模式: “文档”有一个元数据对象,但可以是“PDFMetaData”或“txtmata” 我关注的是: 为了建立这个协会,我可以这样做 class Document belongs_to :metadata, :polymorphic => true end class PDFMetaData has_one :document, :as => :metadata end class TXTMetaData has_one :docu
class Document
belongs_to :metadata, :polymorphic => true
end
class PDFMetaData
has_one :document, :as => :metadata
end
class TXTMetaData
has_one :document, :as => :metadata
end
这是可行的,但对我来说感觉正好相反:一个文档只有一个元数据对象,而不是相反的
另外,在尝试为新文档创建嵌套表单时,我确实遇到了问题。我知道我可以使用字段_,但我如何知道它是什么类型的对象?(PDFMetaData或txtmatadata)。我是否必须根据我所拥有的文档类型来呈现单独的部分
我担心后一个问题与我的第一个问题有关,我做了一些非常错误的事情
谢谢虽然我可以看出您对“属于”和“拥有”的排列方式的混淆,但在这种情况下,基本原理是基于DB模式中外键的位置。documents表包含将其与PdfMetaData对象关联的外键,因此以相反的方式描述关系是没有意义的,因为不可能有多个关系(如何在1数据库行中存储多个外键?) 希望这是有道理的。。。但是关于第二个问题,解决方案取决于
txtmatadata
和PDFMetaData
类上的有效属性列表。如果它们具有相同的属性(或者至少您希望在表单中提供的属性是相同的),那么您应该同意
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