2011-06-18 37 views
1

我有一個類的層次,但不是單表繼承。ActiveRecord模型的繼承和多態性

ThrowAway < ActiveRecord::Base

Junk < ThrowAway

的問題是,所有ThrowAway對象都有一個Location引用。一個Location

belongs_to :throw_away, :polymprohic => true

的問題是,如果我定義

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

那麼,即使垃圾從它繼承並定義了不同的表名,throw_away_type列將始終設置爲ThrowAway在哪裏實際上想要它設置爲Junk

現在會有很多這些小類,所以會有Stuff < ThrowAwayRags < ThrowAway等我希望他們都有一個Location沒有定義每個單獨的類中的位置關係。

這是可能的鐵軌?問題是,不僅僅是位置,還有其他的這種關係,我寧願在這裏跟隨一些DRY。我假設我需要創建一個生成器方法,它將在當前對象上執行並在運行時生成這些關係生成器。

謝謝。

回答

1

ActiveRecord似乎不能配合不是STI的模型繼承。幸運的是,這可能不是你真正想要的。你可能需要一個mixin來代替。

創建一個模塊,其中包含您希望模型共享的所有功能,並讓所有模型都包含該模塊。我可能會將模塊放在模型目錄中,但將它作爲名稱給一個形容詞。有些人可能會將模塊放在lib目錄中,或者在models目錄中爲它創建一個lib目錄。

對於您的情況,您需要在模塊混入時定義關聯,因此您需要使用回調。類似...

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