2011-01-31 51 views
7

我有兩個模型,Article和Recipe,它們有一堆相同的屬性和方法。我想創建一個新類「Post」的子類,並將其中的所有共享邏輯移動到那裏,所以我不保留重複的代碼。我試過這個:Rails中的子類化模型

class Recipe < Post; end 
class Article < Post; end 
class Post < ActiveRecord::Base 
    #all the shared logic 
end 

所有這些類都在標準的./app/models文件夾中。但是,例如,當我轉到/ articles/new時,此代碼會引發ActiveRecord :: StatementInvalid錯誤。錯誤是:

找不到表「崗位」

不知道如何設置呢?

+1

但是你是否已經創建了'posts'表? – Matt 2011-01-31 15:34:02

回答

9

爲什麼不使用模塊?

module Features 
    def hello 
    p "hello" 
    end 
end 

class Recipe < ActiveRecord::Base 
    include Features 
end 

class Article < ActiveRecord::Base 
    include Features 
end 


Recipe.new.hello 
# => "hello" 

Article.new.hello 
# => "hello" 
+0

這很完美。我是新來的鐵軌,不知道這些。請閱讀http://handyrailstips.com/tips/14-drying-up-your-ruby-code-with-modules,這很有道理。謝謝! – weotch 2011-01-31 15:38:18

13

Rails正在使用默認單表Inhritance模式(只是谷歌它),所以當你繼承一個模型中,所有產生的型號將使用同一個數據庫表(在這種情況下posts)。您可以將所有常用方法和驗證放在Post模型中,並將其他類中的特定方法和驗證放入其中,但所有這些類都可以訪問彼此的字段,因爲它們共享同一個表(儘管如此,這並不是什麼大問題)。

如果你只是想分享代碼(方法),你最好將一些常用方法放到lib目錄下的文件模塊中,並將其包含在每個模型中。或者,如果您將所有模型保存在單個文件中,就可以將模塊定義置於頂端。

+0

感謝您爲何解釋原因! – ifightcrime 2013-09-02 16:44:25