ActiveRecord模型继承和多态

时间:2011-06-18 04:13:36

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

我有一个类heirarchy但不是单表继承。

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 < ThrowAway Rags < ThrowAway等。我希望他们都有一个Location而不在每个单独的类中定义位置关系。< / p>

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

感谢。

1 个答案:

答案 0 :(得分:1)

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

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

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

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