2016-02-10 75 views
4

假設我想定義一些方法和幫助器,這些方法和幫助器將在所有我的ActiveRecord模型中可用。活動記錄幫助器方法 - 使用模塊與繼承

的研究有一點告訴我,一般有兩種選擇

模塊

定義模塊

module MyModule 
    def foo 
    # ... 
    end 
end 

它包含在模型當你需要它

class User < ActiveRecord::Base 
    include MyModule 

    before_save :foo 
end 

繼承

定義一個基類

class BaseModel < ActiveRecord::Base 
    # Define as abstract so AR doesn't assume there's a table named `base_models` 
    self.abstract_class = true 

    def foo 
    # ... 
    end 
end 

使所有車型,從它

class User < BaseModel 
    include MyModule 

    before_save :foo 
end 

繼承哪些優點/缺點每個 - 有沒有在做這件事的一種方式任何特別的優勢?有沒有更多的被認爲是「Rails方式」?

謝謝!

回答

6

使用稱爲has而不是is的類/模塊之間的關係總是更好。

或換句話說,最好使用Module而不是inheritance。這是因爲後一種可能的變化,如果你以後在路上獲得兩類課程的要求,你將不得不創建2 BaseClasses,並讓一些類從一個類繼承,而另一個類從另一個類繼承。

當您使用模塊時,您只需包含模塊,因此您可以定義包含它的類的行爲,即所謂的has行爲。

要得到的是什麼碼好,把握好,什麼不是,學習模式和閱讀Clean Code

+0

謝謝! 'has'與'is'概念是定義對象關係的好方法 – user2490003