2010-08-11 36 views

回答

37

一種可能的方式是把共享方法在module像這樣(RAILS_ROOT/lib/shared_methods.rb

module SharedMethods 
    def is_public? 
    # your code 
    end 
end 

然後,你需要兩個包括在每一個模型這個模塊,應該有這樣的方法(即app/models/your_model.rb

class YourModel < ActiveRecord::Base 
    include SharedMethods 
end 

UPDATE

在Rails 4有一個new way要這樣做。你應該把從一個共同的祖先繼承模型的app/models/concerns代替lib

您也可以包容添加類的方法和執行這樣的代碼

module SharedMethods 
    extend ActiveSupport::Concern 

    included do 
    scope :public, -> { where(…) } 
    end 

    def is_public? 
    # your code 
    end 

    module ClassMethods 
    def find_all_public 
     where #some condition 
    end 
    end 
end 
+0

但我需要通過一個變量告訴方法我正在使用什麼類... – NullVoxPopuli 2010-08-11 19:14:56

+1

self.class會給你所調用的方法上下文中的任何類。所以,舉個例子,如果你做了YourModel.new.is_public?,self.class就是YourModel。 – lambdabutz 2010-08-11 19:17:36

5

你也可以做到這一點共享這樣的代碼,其包括共享方法。

class BaseModel < ActiveRecord::Base 
    def is_public? 
    # blah blah 
    end 
end 

class ChildModel < BaseModel 
end 

在實踐中,jigfox的做法通常能夠直接越好,所以不要覺得有義務使用繼承僅僅是出於愛的OOP理論:)

+0

我想這樣做。但我不能讓它工作...... :( – 2014-09-25 20:21:14