2010-08-11 10 views

Respuesta

37

Una manera posible es poner métodos compartidos en un module como esto (RAILS_ROOT/lib/shared_methods.rb)

module SharedMethods 
    def is_public? 
    # your code 
    end 
end 

Luego hay dos incluir este módulo en cada modelo que debe tener estos métodos (es decir app/models/your_model.rb)

class YourModel < ActiveRecord::Base 
    include SharedMethods 
end 

ACTUALIZACIÓN:

En los carriles 4 hay un new way para hacer esto. Usted debe colocar el código compartido como este en app/models/concerns lugar de lib

También puede agregar métodos de clase y ejecutar código en la inclusión como esto

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

pero que tendría que pasar una variable diciendo la método qué clase estoy usando ... – NullVoxPopuli

+1

self.class le daría cualquiera que sea la clase en el contexto de ese método que se llama. Entonces, por ejemplo, si hicieras YourModel.new.is_public ?, self.class sería YourModel. – lambdabutz

5

También puede hacer esto mediante la herencia de los modelos a partir de un ancestro común, que incluye los métodos compartidos.

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

class ChildModel < BaseModel 
end 

En la práctica, jigfox 's enfoque a menudo funciona mejor, por lo que no se sienta obligado a utilizar la herencia más que por amor a la teoría de la programación orientada a objetos :)

+0

Quiero hacerlo de esta manera. Pero no puedo hacer que funcione ... :( –