2010-08-11 12 views

Odpowiedz

37

Jednym z możliwych sposobów jest wprowadzenie wspólnych metod w module tak (RAILS_ROOT/lib/shared_methods.rb)

module SharedMethods 
    def is_public? 
    # your code 
    end 
end 

to trzeba dwa to ten moduł w każdym modelu, który powinien mieć to metody (tj app/models/your_model.rb)

class YourModel < ActiveRecord::Base 
    include SharedMethods 
end 

UPDATE:

W szyn 4 jest new way, aby to zrobić. należy umieścić wspólny kod jak to w app/models/concerns zamiast lib

Ponadto można dodać metod klasy i wykonanie kodu na włączenie się ten

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

ale muszę przekazać zmienną mówi metoda, z której klasy korzystam ... – NullVoxPopuli

+1

self.class da ci wszystko, co klasa jest w kontekście wywoływania tej metody. Na przykład, jeśli zrobiłeś YourModel.new.is_public ?, self.class będzie YourModel. – lambdabutz

5

Można też to zrobić przez dziedziczenie modeli od wspólnego przodka, który obejmuje wspólne metody.

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

class ChildModel < BaseModel 
end 

W praktyce jigfox „s podejście często pracuje się lepiej, więc nie czują się zobowiązani do korzystania dziedziczenia jedynie z miłości do teorii OOP :)

+0

Chcę to zrobić w ten sposób. Ale nie mogę sprawić, żeby to działało ... :( –