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_type和person_id列persons.
现在,Drive和Passenger都继承了Person属性,验证和方法.
为什么不使用单表继承?例如:
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,以及从中派生的两个特定类