Alguien sabe que es lo que hace el metodo find “por debajo”?
Es decir, si se hace un find(:id), supongo que hace una consulta y
devuelve
todos los datos de ese registro. Pero si se hace un find(:all), que es
lo
que hace? una consulta devolviendolo todos los datos ( multiples tablas
) de
todos los registros, o una consulta por cada registro que pueda
encontrar?
Alguien sabe que es lo que hace el metodo find “por debajo”?
Pues ahora mismo no te lo puedo decir porque no tengo acceso a una
máquina co Rails, pero las sentencias SQL que genera ActiveRecrod
deberÃan salir en log/development.log en lujoso technicolor.
En cuanto a las consultas SQL, simplemente el find(:all) no pide un
elemento en concreto, sino que devuelve todos.
Tabla.find(9) => SELECT * FROM Tabla WHERE id=9
Tabla.find(:all) =>SELECT * FROM Tabla
----- Original Message -----
From: Javier M.
To: La lista sobre Ruby On Rails (rubyonrails.com) en castellano
Sent: Tuesday, October 24, 2006 9:10 AM
Subject: [Ror-es] metodo find
Alguien sabe que es lo que hace el metodo find “por debajo”?
Es decir, si se hace un find(:id), supongo que hace una consulta y
devuelve todos los datos de ese registro. Pero si se hace un find(:all),
que es lo que hace? una consulta devolviendolo todos los datos (
multiples tablas ) de todos los registros, o una consulta por cada
registro que pueda encontrar?
find (:all) va a devolverte un array con una hash por cada registro
encontrado. Si en tu find incluyes claúsulas :joins o :include,
igualmente hace una sola query con todas las joins necesarias,
devolviendo una hash por cada registro con los campos de todas las
tablas (puedes usar la clausula :select para acotar eso)
creo que no me entendiste bien (probablemente tampoco me explicase lo
suficiente)
por lo que veo, tú haces aquà un find y luego iteras por los resultados.
En este caso, te hace una select por cada hijo
sin embargo, si como decÃa en mi anterior post, utilizas el parámetro
:include para forzar el eager load, te hace una única select incluyendo
las tablas necesarias. En el log lo verás claramente porque lo marca
como
“NombreDelModelo Load Including Associations” justo antes de la traza
SQL
Mi duda es si el acceso al resultset lo hace via cursor (que creo que
no) o si se trae todos los resultados asociados y monta el array de
hashes con eso, con el potencial gasto de memoria en queries largas con
muchas tablas relacionadas.