【问题标题】:ActiveRecord model inheritence and polymorphismActiveRecord 模型继承和多态性
【发布时间】:2011-06-18 04:13:35
【问题描述】:

我有一个类层次结构,但没有单表继承。

ThrowAway < ActiveRecord::Base

Junk < ThrowAway

问题是所有ThrowAway 对象都引用了Location。一个Location

belongs_to :throw_away, :polymprohic => true

问题是如果我定义

ThrowAway < ActiveRecord::Base
  has_many :locations, :as => :throw_away
end

那么即使 Junk 继承自它并定义了不同的表名,throw_away_type 列将始终设置为 ThrowAway,而我实际上希望它设置为 Junk

现在会有很多这样的子类,所以会有Stuff &lt; ThrowAway Rags &lt; ThrowAway 等。我希望它们都有一个Location,而不需要在每个单独的类中定义位置关系。

这可以通过rails实现吗?问题是不仅有位置,还有其他类型的关系,我宁愿在这里遵循一些 DRY。我假设我需要创建一个生成器方法,该方法将在当前对象上执行并在运行时生成这些关系生成器。

谢谢。

【问题讨论】:

    标签: ruby-on-rails activerecord polymorphic-associations


    【解决方案1】:

    ActiveRecord 似乎无法与不是 STI 的模型继承合作。幸运的是,这可能不是你真正想要的。你可能想要一个 mixin。

    创建一个包含您希望模型共享的所有功能的模块,并让您的所有模型都包含该模块。我可能会将模块放在您的模型目录中,但给它一个形容词作为名称。有些人可能会将模块放在 lib 目录中,或者在模型目录中为其创建一个 lib 目录。

    在您的情况下,您希望在混合模块时定义关联,因此您需要使用回调。有点像..

    module Trashable
      def self.included(base)
        base.send :has_many, :locations, :as => :throw_away
      end
    end
    

    【讨论】:

      猜你喜欢
      • 2014-06-01
      • 1970-01-01
      • 2018-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-18
      • 2013-06-21
      相关资源
      最近更新 更多