代码之家  ›  专栏  ›  技术社区  ›  Ganesh Shankar

Rails 3中的类表继承

  •  13
  • Ganesh Shankar  · 技术社区  · 16 年前

    我目前正在开发一个Rails3应用程序,它看起来可能需要对几个模型使用类表继承。

    下面是一个简单的例子。

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

    Person(或两种类型的人…)有两个子类,司机和乘客。这两个子类共享Person的通用属性,但随后又具有特定的附加属性,这些属性是它们自己独有的。(例如,一名驾驶员可以拥有许多车辆和执照,但一名乘客不会)

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

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

    但它并没有推测如何从驾驶员或乘客对象中访问一个人的公共属性,对此我有点困惑。

    特别是,我想知道的是:

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

    4 回复  |  直到 16 年前
        1
  •  7
  •   Hassan    15 年前

    还有一个插件“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_type 和 person_id 列到 persons
    现在,驾驶员和乘客都继承个人属性、验证和方法。

        2
  •  5
  •   Andrea Pavoni    16 年前

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

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

        3
  •  4
  •   Bruno The Frank    15 年前

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

        4
  •  2
  •   Pete Hamilton    15 年前

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

    考虑一下: http://peterhamilton.github.com/citier

    它还支持主要的SQL语言SQLite、MySQL、PostgreSQL,可能还有更多,但我没有;我没有测试它们。