13

我目前正在开发一个 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 回调并分离出哪个属性更新去哪里?还是有更好的方法来解决这个问题?

4

4 回答 4

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

不要忘记在表格中添加person_typeperson_idpersons
现在 Drive 和 Passenger 都继承了 Person 属性、验证和方法。

于 2011-06-13T03:57:54.253 回答
5

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

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

class Driver < Person
   # Driver code
end

class Passenger < Person
   # Passenger code
end

这样,您将拥有一个公共类 Person,以及从它派生的两个特定类

于 2010-08-17T08:11:52.333 回答
4

我正在使用类表继承插件,它运行良好, http: //github.com/brunofrank/class-table-inheritance

于 2010-10-21T01:12:03.743 回答
2

我最近分叉了一个很有前途的项目来在 Rails 中实现多表继承和类继承。我花了几天时间对其进行快速开发、修复、评论和文档,并将其重新发布为 CITIER(Rails 的类继承和表继承嵌入)。

我认为您可以将其与上述答案结合起来吗?

考虑看看: http: //peterhamilton.github.com/citier

我查看了诸如 class-table-inheritance repo 之类的解决方案,但这更清晰、更合乎逻辑的 IMO。

它还支持主要的 SQL 语言 SQLite、MySQL、PostgreSQL 等等,但我还没有测试过它们。

于 2011-04-29T14:15:40.297 回答