我已经为此奋斗了一天,所以我们开始:
我有一个用户模型。但是有3种类型的用户(实际上更多,但是让我们完成此操作)。假设有人才,经理和董事。但是他们都是用户。一个经理有很多人才,一个人才有一个经理。主任有很多经理,经理有一个主任。人才通过经理只有一名董事。
显然,使用三个单独的模型,这将是微不足道的。但是它们都是用户,因此有必要将其保留在用户模型中。
最简单的方法是什么?如果我必须使用宝石,那就这样吧,但是我宁愿...
谢谢!
答案 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"]}
如果您没有 在表格中定义的类型列,单表继承不会 触发。在这种情况下,它将像使用 没有什么特别的魔法可以区分它们或重新加载 带有查找的正确类型。