ruby on rails - rails - Rieles: ¿Es posible definir un ámbito con nombre en un módulo?
ruby rails active record (3)
A partir de Rails 3.1, la sintaxis se simplifica un poco por ActiveSupport :: Concern:
Ahora puedes hacer
require ''active_support/concern''
module M
extend ActiveSupport::Concern
included do
scope :disabled, where(:disabled => true)
end
module ClassMethods
...
end
end
ActiveSupport :: Concern también barre las dependencias del módulo incluido, aquí está la documentación
[actualización, abordando el comentario de aceofbassgreg]
El Rails 3.1 y posterior ActiveSupport :: Concern permite que los métodos de instancia de un módulo de inclusión se incluyan directamente, por lo que no es necesario crear un módulo de InstanceMethods dentro del módulo incluido. Además, ya no es necesario en Rails 3.1 y versiones posteriores para incluir M :: InstanceMethods y extender M :: ClassMethods. Entonces podemos tener un código más simple como este:
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"
Digamos que hay 3 modelos: A, B y C. Cada uno de estos modelos tiene el atributo x
.
¿Es posible definir un ámbito con nombre en un módulo e incluir este módulo en A, B y C?
Intenté hacerlo y recibí un mensaje de error que dice que no se reconoce el scope
...
En cuanto a Rails 4.x puedes usar gemas scopes_rails
Puede generar archivo de scopes
e incluirlo en su modelo.
Además, puede generar automáticamente ámbitos para estados state_machines
.
Sí lo es
module Foo
def self.included(base)
base.class_eval do
scope :your_scope, lambda {}
end
end
end