raw rails query left joins inner includes active ruby-on-rails ruby-on-rails-3 named-scope

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