【问题标题】:Rails Polymorphic association + fields_forRails 多态关联 + fields_for
【发布时间】:2011-08-12 20:20:43
【问题描述】:

我正在努力思考如何使用多态关联设置此架构:

“文档”有一个元数据对象,但可以是“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)。我是否必须根据我拥有的文档类型来呈现单独的部分?

恐怕后者与我的第一个问题有关,而且我做错了什么。

谢谢

【问题讨论】:

    标签: ruby-on-rails forms polymorphism


    【解决方案1】:

    虽然我可以看到您在这种情况下对 belongs_to 和 has_one 的安排感到困惑,但其基本原理是基于 foreign_key 在 DB 模式中的位置。文档表包含将其与 PdfMetaData 对象相关联的 foreign_key ,因此反过来描述关系是没有意义的,因为没有办法拥有 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-23
      • 2019-03-14
      • 2016-04-05
      相关资源
      最近更新 更多