2010-08-11 13 views

cevap

37

olası bir yolu Sonra (yani app/models/your_model.rb) Bu yöntemler

class YourModel < ActiveRecord::Base 
    include SharedMethods 
end 
olmalıdır her modelde bu modülü içeren iki ihtiyaç bu ( RAILS_ROOT/lib/shared_methods.rb)

module SharedMethods 
    def is_public? 
    # your code 
    end 
end 

gibi module paylaşılan yöntemleri koymaktır

GÜNCELLEME: Raylar 4'te

bir 012 var Bunu yapmak için. Sen, ortak bir atadan modelleri devralan tarafından size de yapabilirsiniz bu

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

için sadece sevgiden miras kullanmayı zorunda hissetmeyin yok ama söyleyen bir değişken geçirmek gerekir Metodu kullanıyorum hangi yöntem sınıfın bağlamında olursa olsun ... – NullVoxPopuli

+1

self.class size verir. Yani, örneğin, YourModel.new.is_public'i yaptıysanız, self.class YourModel olur. – lambdabutz

5

gibi içerme kod sınıf yöntemleri ekleyip yürütebileceği app/models/concerns yerine Ayrıca

lib arasında böyle kod paylaşımlı yerleştirebilirsiniz hangi Paylaşılan yöntemleri içerir. Uygulamada

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

class ChildModel < BaseModel 
end 

, jigfox yaklaşımı genellikle daha iyi çalışır, böylece cepten teorisi :)

+0

Bunu bu şekilde yapmak istiyorum. Ama yapamam ki ... :( –