2011-01-15 22 views

Respuesta

44

sí lo es

module Foo 
    def self.included(base) 
    base.class_eval do 
     scope :your_scope, lambda {} 
    end 
    end 
end 
+0

¿Se puede definir la validación y la relación de esta manera? – CantGetANick

+0

No puedo decir el 100%, pero no puedo pensar por qué no. –

+0

Yap, Y funciona. Gracias por el ejemplo. – CantGetANick

29

A partir de Rails 3.1 la sintaxis se simplifica un poco a ActiveSupport: : preocupación:

ahora que se puede hacer

require 'active_support/concern' 

module M 
    extend ActiveSupport::Concern 

    included do 
    scope :disabled, where(:disabled => true) 
    end 

    module ClassMethods 
    ... 
    end 
end 

ActiveSupport :: La preocupación también arrasa en las dependencias del módulo incluido, here is the documentation

[actualización, dirigiéndose de aceofbassgreg comentario]

Los rieles 3.1 y posteriores ActiveSupport :: La preocupación permite una inclusión métodos de instancia del módulo que se incluirán directamente , por lo que no es necesario crear un módulo InstanceMethods dentro del módulo incluido. Además, ya no es necesario en Rails 3.1 y posteriores para incluir M :: InstanceMethods y extender M :: ClassMethods. Así podemos tener código más simple como esto:

require 'active_support/concern' 
module M 
    extend ActiveSupport::Concern 
    # foo will be an instance method when M is "include"'d in another class 
    def foo 
    "bar" 
    end 

    module ClassMethods 
    # the baz method will be included as a class method on any class that "include"s M 
    def baz 
     "qux" 
    end 
    end 

end 

class Test 
    # this is all that is required! It's a beautiful thing! 
    include M 
end 

Test.new.foo # ->"bar" 
Test.baz # -> "qux" 
+0

gracias por el enlace a la docummentación –

+0

Punto de aclaración: si, en su modelo, extiende 'M :: ClassMethods' e incluye' M :: InstanceMethods', querrá agregar la lógica 'extender ActiveSupport :: Concern' en el módulo 'M :: InstanceMethods'. Quizás en este caso Les incluya 'M' en el modelo (y no tenga un módulo' M :: InstanceMethods'?). – aceofbassgreg

-1

En cuanto a los carriles 4.x puede utilizar joya scopes_rails

Puede generar scopes archivo e incluirla en su modelo.

Además, puede generar automáticamente ámbitos para estados state_machines.

Cuestiones relacionadas