El método where
devuelve un objeto ActiveRecord::Relation
y, por sí solo, este objeto no emite una consulta de base de datos. Es donde utiliza este objeto que importa.
En la consola, es probable que estés haciendo esto:
@person = Person.where(name: "Jason")
Y luego blammo se emite una consulta de base de datos y devuelve lo que parece ser una serie de todo el mundo llamado Jason. Yay, Active Record!
Pero entonces se hace algo como esto:
@person = Person.where(name: "Jason").where(age: 26)
Y luego que emite otra consulta, pero esto es para las personas que son llamados Jason, que son 26. Pero es sólo la emisión de uno consulta, por lo que cuando ¿La otra consulta ir?
Como otros han sugerido, esto está sucediendo porque el método where
devuelve un objeto proxy. En realidad, no realiza una consulta y devuelve un conjunto de datos a menos que se le pida que haga eso.
Cuando ejecuta cualquier cosa en la consola, se imprimirá la versión inspeccionada del resultado de lo que sea que haya ejecutado. Si coloca 1
en la consola y pulsa enter, obtendrá 1
porque 1.inspect
es 1
. ¡Magia! Lo mismo vale para "1"
. Una variedad de otros objetos no tienen un método inspect
definido y, por lo tanto, Ruby vuelve al que está en Object
, que devuelve algo espantoso como <Object#23adbf42560>
.
Cada objeto ActiveRecord::Relation
único tiene el método inspect
definido en él para que se produzca una consulta. Cuando escribe la consulta en su consola, IRB llamará al inspect
en el valor de retorno de esa consulta y obtendrá algo casi legible, como la matriz que verá.
Si se acaba de emitir esta en una secuencia de comandos estándar de Ruby, entonces no hay ninguna consulta se ejecutaría hasta que el objeto fue inspeccionado (a través de inspect
) o fue reiterado mediante el uso de each
, o tenían el método to_a
invocado.
Hasta una de esas tres cosas sucede, se pueden encadenar tantas where
declaraciones sobre como le va a gustar y luego, cuando hacer llamada inspect
, to_a
o each
en él, entonces será finalmente ejecutar esa consulta.
no lo hace en el último método. No tiene forma de saber eso. Considere 'x = Person.where (..); @person = x.where (..) ', que debería funcionar de forma idéntica. Lo hace en algún momento más tarde, entonces, ¿cuál es el desencadenante? ;-) –