Rails中的类表继承3

Gan*_*kar 13 class-table-inheritance ruby-on-rails-3

我目前正在开发一个Rails 3应用程序,看起来可能需要为几个模型使用类表继承.

这是一个简单的例子.

我有一个名为Person的类,它具有通用属性,如名称,电子邮件,密码,这些属性对应用程序中的所有类型的人都是通用的,并用于身份验证.

Person(或两种类型的人......),Driver和Passenger有两个子类.这两个子类共享Person的通用属性,但具有特定的附加属性,这些属性对于它们自身是唯一的.(例如,司机可以拥有许多车辆和许可证,但乘客不会)

在这种情况下,我如何实施CTI?我一直在看这里提供的一个例子:

http://rhnh.net/2010/08/15/class-table-inheritance-and-eager-loading

但它没有推测如何从Driver或Passenger对象访问Person的公共属性,我对此有点困惑.

特别是,我想知道的是:

如果我正在更新驱动程序的属性,我如何轻松访问和更新父人员表上的相关属性?我是否必须挂钩到after_save回调并分离出哪个属性更新在哪里?或者有更好的方法来解决这个问题吗?

小智 7

还有一个插件'acts_as_relation'来执行此操作,
https://github.com/hzamani/acts_as_relation/

在你的情况下代码将是这样的:

class Driver < ActiveRecord::Base
   acts_as :person
end

class Passenger < ActiveRecord::Base
  acts_as :person
end
Run Code Online (Sandbox Code Playgroud)

不要忘记向表中添加列person_typeperson_idpersons.
现在,Drive和Passenger都继承了Person属性,验证和方法.


And*_*oni 5

为什么不使用单表继承?例如:

class Person < ActiveRecord::Base
   # some common code here
end

class Driver < Person
   # Driver code
end

class Passenger < Person
   # Passenger code
end
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您将拥有一个公共类Person,以及从中派生的两个特定类

  • 有时人们会问不正确的问题,我刚刚回答了他的问题的可能解决方案. (21认同)
  • 注意:OP询问如何使用类表继承,而不是单表继承. (13认同)
  • 然后它应该被建议作为评论. (10认同)