【问题标题】:Polymorphic abstraction of Models and potential MI in rails?模型的多态抽象和 Rails 中的潜在 MI?
【发布时间】:2010-07-06 18:22:12
【问题描述】:

我们的架构中有 SupplierDistributorVendorBuyer 等模型。这些实体具有一些共同的属性(如名称、描述、销售办事处等),但大多数情况下它们具有不同的架构,具有不同的 has_many :through 关联(供应商有许多 stock_keeping_units ,其他没有)因为它们需要被折叠到单独的模型。

我们在系统中也有各种类型的Events,例如合作伙伴活动、分销活动、采购活动等。

如何创建 is_a 关系并将这些买方、供应商等模型抽象为公司模型,并在创建事件时(例如合作伙伴事件)简单地说公司 1 与公司 2 合作不用担心公司类型是什么,这样我就可以在我的表单部分上为事件提交做这样的事情:

  <p>
    <%= f.label "Company 1" %>
    <%= f.collection_select :partnering_company_id_1, Company.all ,:id, :name, { :default => true} %>
  </p>

如果需要,我愿意分享架构的更多细节。这可能吗?我最近遇到了this 博客文章,其中描述了 MTI,但我不确定这是否适用于当前的问题陈述。

【问题讨论】:

    标签: ruby-on-rails ruby polymorphism multiple-inheritance


    【解决方案1】:

    我会使用单表继承。我相信当您拥有具有非常相似属性的模型时,这是最好的解决方案。

    例如,对于 Events,您只有一个表 (events),它必须有一个 type 列。

    没有关于 STI 的好的文档(至少我没有找到),但是 thisthis 应该有点帮助...

    【讨论】:

    • 不太热衷于 STI,因为模型只共享一些共同的属性并且有自己的 has_many:through 关联。此外,这些模型中的每一个都可能可以通过 sphinx 单独搜索
    • 你可以有很多模型。 STI 的问题是您将只有一张桌子。但是,如果您的模型不共享许多属性,这不是最好的解决方案。
    【解决方案2】:

    我不知道这是否仍然相关,但我最近致力于 MTI 解决方案。它超级简单,效果很好,看起来正是你所需要的(ed) :)

    考虑看看:http://peterhamilton.github.com/citier

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多