【问题标题】:Multiple table inheritance Rails and activerecord多表继承 Rails 和 activerecord
【发布时间】:2013-04-01 22:38:56
【问题描述】:

我正在尝试使用 ActiveRecord 实现多表继承。看起来所有可用的宝石都很旧。我错过了什么吗?是否有任何“本机”方法可以使用 activerecord 实现这一点? 我正在使用 Rails 3.2.3 和 activerecord 3.2.1

【问题讨论】:

  • 对于多表继承与单表继承与类表继承之间的确切区别,开发人员存在很多困惑。我认为在我正确地给你答案之前,确定你认为你指的是什么很重要。这绝对是我感兴趣的话题,所以如果您有任何更新的信息要提供,请发布更新。 :)

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


【解决方案1】:

Rails 6.1+ 委托类型

Rails 6.1 添加了一种“原生”方式来通过delegated type 实现多表继承。

the corresponding PR for details

使用这种方法,“超类”是一个具体的类,由它自己的表表示,其中存储了所有“子类”之间共享的所有超类属性。然后每个子类都有自己的单独表,用于特定于其实现的附加属性。这类似于 Django 中所谓的多表继承,但这种方法不是实际继承,而是使用委托来形成层次结构并分担责任。

【讨论】:

    【解决方案2】:

    单表继承(每辆 Car 和 Truck 共享一个数据库)

    class Vehicle < ActiveRecord
    end
    
    class Car < Vehicle
    end
    
    class Truck < Vehicle
    end
    

    在您的情况下,您不是共享数据库,而是共享功能。然后您应该编写一个模块并将其包含在每个模型中

    class Car < ActiveRecord
      extend VehicleFinders
    end
    
    class Truck < ActiveRecord
      extend VehicleFinders
    end
    
    module VehicleFinders
      def find_purchased
        #...
      end
    end
    

    所以extend模块的方法是调用类的类方法。include模块的方法是调用类对象的实例方法

    这对你来说可能是一本好书http://raysrashmi.com/2012/05/05/enhance-rails-models

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多