【问题标题】:Class Table Inheritance in Rails 3Rails 3 中的类表继承
【发布时间】:2010-08-17 03:56:30
【问题描述】:

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

【问题讨论】:

  • 我应该补充一点,这是我的应用程序中实际发生的事情的简化示例。我确定我需要在我的情况下实现类表继承,单表继承不是最好的方法。
  • 我在我的问题中提到的博客上发表了评论,作者好心地提供了一种方法的例子:rhnh.net/2010/08/17/updating-class-table-inheritance-tables(你摇滚泽维尔!)

标签: ruby-on-rails-3 class-table-inheritance


【解决方案1】:

还有一个插件“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_id 列添加到persons 表中。
现在 Drive 和 Passenger 都继承了 Person 属性、验证和方法。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 注意:OP 询问了如何使用类表继承,而不是单表继承。
    • 有时人们问的问题不正确,我只是回答了他的问题的可能解决方案。
    • 那么应该建议作为评论。
    【解决方案3】:

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

    【讨论】:

    • 谢谢你的提示,我去看看插件!
    • 不是最好的解决方案,导致无法在 postgres 上正常工作(即,如果您打算将 heroku 与 postgres 一起使用,请不要使用它)
    【解决方案4】:

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

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

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

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

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

    【讨论】:

    • 这个 gem 似乎是三者中功能最完整的。请问您是否研究过性能比较?并且还与 Sunspot 集成(因为使用了 db 视图)?
    • 效果很好......但是我们在使用heroku时遇到了很多问题。它不喜欢表格视图,尤其是在推/拉数据库时。最终删除它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-29
    相关资源
    最近更新 更多