【问题标题】:Hierarchy within one active record table?一个活动记录表中的层次结构?
【发布时间】:2018-08-17 08:20:42
【问题描述】:

我已经为此纠结了一天多,所以我们开始吧:

我有一个用户模型。但是有 3 种类型的用户(实际上更多,但让我们完成这个)。假设有人才、经理和董事。但他们都是用户。一个经理有很多人才,人才有一个经理。董事有多名经理,经理有一名董事。 Talent 通过 Manager 拥有一名董事。

显然,对于三个独立的模型,这将是微不足道的。但他们都是用户,有必要将他们保留在 User 模型中。

最简单的方法是什么?如果我必须使用宝石,就这样吧,但我宁愿不...

谢谢!

【问题讨论】:

  • 这似乎是单表继承的用例:api.rubyonrails.org/classes/ActiveRecord/Inheritance.html
  • 是的,我明白了。谢谢。为了清楚起见,迁移时不需要其他任何东西 - 只需创建一个用户表,然后按照描述构建类?
  • 是的,您将只有一个表 users,然后您将添加一列 type,这将帮助您区分您正在创建的 user 的类型。
  • 是的,检查 STI
  • 要清楚我现在做的事情是正确的——当我需要的时候,说 Talent to belongs_to a Manager,我现在必须在 User 表中添加一个 manager_id 列,对吗?然后,经理、董事等就不会使用该列了……看起来有点乱,但这就是必须要做的吗?

标签: ruby-on-rails database rails-activerecord


【解决方案1】:

Single Table Inheritance 最适合您的问题描述:

单表继承 Active Record 允许通过存储来继承 列中的类名,默认命名为“type”(可以 覆盖Base.inheritance_column)。这意味着一个 继承看起来像这样:

class Company < ActiveRecord::Base; end

class Firm < Company; end

class Client < Company; end

class PriorityClient < Client; end

当你做Firm.create(name: "37signals")时,这条记录将被保存在 类型为“公司”的公司表。然后您可以获取此行 再次使用Company.where(name: '37signals').first 它会返回 一个坚固的对象。

请注意,因为类型列是记录上的一个属性 每个新的子类都会立即被标记为脏,并且类型 列将包含在更改的属性列表中 记录。这与非单表继承(STI)不同 类:

Company.new.changed? # => false

Firm.new.changed? # => true

Firm.new.changes # => {"type"=>["","Firm"]}如果你没有 表中定义的类型列,单表继承不会 触发。在这种情况下,它将像普通的子类一样工作 没有特殊的魔法来区分它们或重新加载 用 find 正确输入。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-10
    • 2012-03-01
    • 2019-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多