Ruby on rails Rails多态关联&x2B;字段

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

我正试图了解如何使用多态关联设置此模式:

“文档”有一个元数据对象,但可以是“PDFMetaData”或“txtmata”

我关注的是:

为了建立这个协会,我可以这样做

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