我有一个类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。我假设我需要创建一个生成器方法,该方法将在当前对象上执行并在运行时生成这些关系生成器。
感谢。
答案 0 :(得分:1)
ActiveRecord似乎无法与不是STI的模型继承合作。幸运的是,这可能不是你真正想要的。你可能想要一个mixin。
创建一个模块,其中包含您希望模型共享的所有功能,并让所有模型都包含该模块。我可能会把模块放在你的模型目录中,但给它一个形容词作为名称。有些人可能会将模块放在lib目录中,或者在models目录中为它创建一个lib目录。
在您的情况下,您希望在模块混合时定义关联,因此您需要使用回调。像...这样的东西。
module Trashable
def self.included(base)
base.send :has_many, :locations, :as => :throw_away
end
end