raw rails query foreign create association and active ruby-on-rails ruby-on-rails-3 scope argument-error

ruby on rails - rails - Error de argumento: el cuerpo del alcance debe ser recuperable



ruby rails active record (4)

El cuerpo del alcance necesita envolverse en algo invocable como un Proc o Lambda:

scope :visible, -> { where(:visible => true) }

La razón de esto es que garantiza que el contenido del bloque se evalúa cada vez que se utiliza el alcance.

Estoy trabajando en el ''Entrenamiento Esencial de Ruby On Rails 3'' y he tenido un problema al usar los ámbitos de nombres. Al buscar registros y usar consultas dentro de la consola de Rails todo transcurrió sin problemas hasta que traté de usar un alcance de nombre en mi archivo subject.rb. Este es mi código en el archivo subject.rb.

Class Subject < ActiveRecord::Base scope :visible, where(:visible => true) end

Guardé el archivo .rb y reinicié mi consola Rails, pero cuando corro desde la consola de mis rails:

subjects = Subject.visible

Obtengo: ArgumentError: The scope body needs to be callable.

¿Alguien sabe por qué estoy recibiendo este error?


Obtuve el mismo error, mientras que antes de mi solución tenía un espacio entre where y ( como debajo

scope :registered , -> { where ( place_id: :place_id , is_registered: :true ) }

después de eliminar el espacio entre where y ( como a continuación, hice que mi página funcione

scope :registered , -> { where( place_id: :place_id , is_registered: :true ) }


Qué está usando: scope :visible, where(:visible => true) va para la carga ansiosa, y ha quedado obsoleto en Rails 4.

scope :visible, where(:visible => true)

Esta línea de código se evalúa cuando se carga la clase particular, y no en ese momento, se llama a este mismo scope .

Hay algunos casos en que esto sí importa, como:

scope :future, where(''published_at > ?'', Time.now) scope :future, -> { where(''published_at > ?'', Time.now) }

En primer caso ? será reemplazado con el mismo tiempo en que se habría cargado la clase, pero el segundo y el caso correcto, ese tiempo se usará en el que se habría llamado al alcance de la clase.


Sí, de hecho, esto es una manera de llamar los ámbitos 4 rails. Tendrás que cambiarlo, si estás actualizando a Rails 4 desde Rails 3.