ruby on rails - studio - ¿Ámbitos compartidos a través del módulo?
visual studio installer (3)
Como en la sintaxis del alcance de los rieles 4, simplemente puede usar un lambda para retrasar la ejecución del código (también funciona en los rieles 3):
module CommonScopes
extend ActiveSupport::Concern
included do
scope :ordered_for_display, -> { order("#{self.to_s.tableize}.rank asc") }
end
end
Quiero secar varios modelos moviendo ámbitos compartidos en un módulo, algo como:
module CommonScopes
extend ActiveSupport::Concern
module ClassMethods
scope :ordered_for_display, order("#{self.to_s.tableize}.rank asc")
end
end
También quiero crear especificaciones compartidas que prueben el módulo. Desafortunadamente, cuando intento incluir el alcance compartido en mi modelo, obtengo:
undefined method `order'' for CommonScopes::ClassMethods:Module
¿Algunas ideas? ¡Gracias!
Debido a que se llama a su método de scope
inmediatamente cuando Ruby analiza su módulo y no se puede acceder a él desde su módulo CommonScopes
...
Pero puedes reemplazar tu llamada de alcance por un método de clase:
module CommonScopes
extend ActiveSupport::Concern
module ClassMethods
def ordered_for_display
order("#{self.to_s.tableize}.rank asc")
end
end
end
Puedes usar instance_eval
module CommonScopes
extend ActiveSupport::Concern
def self.included(klass)
klass.instance_eval do
scope :ordered_for_display, order("#{self.to_s.tableize}.rank asc")
end
end
end