一个活动记录表中的层次结构?

时间:2018-08-17 08:20:43

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

我已经为此奋斗了一天,所以我们开始:

我有一个用户模型。但是有3种类型的用户(实际上更多,但是让我们完成此操作)。假设有人才,经理和董事。但是他们都是用户。一个经理有很多人才,一个人才有一个经理。主任有很多经理,经理有一个主任。人才通过经理只有一名董事。

显然,使用三个单独的模型,这将是微不足道的。但是它们都是用户,因此有必要将其保留在用户模型中。

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

谢谢!

1 个答案:

答案 0 :(得分:1)

Web Service最适合您的问题描述:

  

单表继承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")时,此记录将保存在   类型为“ Firm”的公司表。然后,您可以提取此行   再次使用Company.where(name: '37signals')。first,它将返回   一个Firm对象。

     

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

     

Company.new.changed? # => false

     

Firm.new.changed? # => true

     

Firm.new.changes # => {"type"=>["","Firm"]}如果您没有   在表格中定义的类型列,单表继承不会   触发。在这种情况下,它将像使用   没有什么特别的魔法可以区分它们或重新加载   带有查找的正确类型。