【问题标题】:Rails: Models that inherit columns from parent, and each have additional columnsRails:从父级继承列的模型,每个模型都有额外的列
【发布时间】:2016-12-20 01:09:24
【问题描述】:

我正在创建一个适用于多种运动(例如水肺潜水和跳伞)的日志应用程序,并且我正在尝试找到一种方法让子模型不仅继承父方法,而且继承父(数据库)列。

一张图片可以更好地解释: Logbook database sample

因此,ScubaDiving、FreeDiving 和 SkyDiving 类别下的任何模型都是我将从视图中调用的模型。
但是,Parent 或 Diving 下的模型永远不会被调用,并且仅用于使用数据库列(可能还有方法)填充其子代。

创建模型 + 关联 + 继承的最佳方式是什么?

根据我所做的研究,我了解到:

  1. 单表继承:
    • 只会传递父方法,而不是数据库列
  2. 多态关联:
    • 我将我的情况与我找到的示例(照片、文章、帖子上的 cmets)进行了比较,但我的 Divespot 和 Airport(等效:照片、文章)不能有 很多 个 Spot(eq:评论)。
  3. 多表继承:
    • 无法让它工作,但它似乎最接近我的目标?
  4. 简单模型:
    • 我总是可以为每个孩子(没有父母)创建一个模型并重复代码。我还是想看看有没有办法重构。

我正在使用 Rails 5 和 PostGresql 数据库。

【问题讨论】:

    标签: ruby-on-rails postgresql inheritance polymorphic-associations sti


    【解决方案1】:
    1. 单表继承:
      • 只会传递父方法,而不是数据库列

    当然,所有类都继承数据库列。由于所有类都“存在”在同一个表中,因此它们具有相同的列。由于另一个原因,STI 可能不是您的情况的最佳解决方案 - 每个模型的列似乎不同,因此对于没有这些列的模型,您会有一堆“NULL”列。

    我建议考虑为每个类创建一个模型/表,然后将子对象链接到代表父对象的对象。例如,您可以将名称、位置等方法委托给 Spot。然后您可能需要使用多态关联。你可以有点花哨,尝试“正确的” MTI,见this guide

    【讨论】:

    • 该指南对我来说有点难以理解,但我最终做了类似的事情。我设置了一个多态模型,我的相似类连接到该模型,允许它们访问共享列。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-24
    相关资源
    最近更新 更多