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?

Espero haberme explicado. :stuck_out_tongue:

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

Lo mejor para ver como funciona cada método es mirar la documentación (
ActiveRecord::Base ) y
mirar el development.log en el que podrás ver cada una de las consultas
que ejecuta cada uno de los metodos que uses.

Salu2
J

----- 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?

Espero haberme explicado. :stuck_out_tongue:

hola,

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)

ojo con las queries, que hasta donde sé (corregidme si estoy equivocado)
el acceso no va por cursores. El adaptador se trae todas las filas y
monta el array con eso. El coste en memoria puede ser grande. Usando
:limit y :offset adecuadamente se puede jugar con eso

saludos,

j

Es que no sé yo si find :all a secas se puede hacer. Es un método de un
objeto activerecord.

Si haces Objeto.find(:id) hace una consulta así: select * from objetos
where
id = :id

Y si haces Objeto.find(:all) la consulta es select * from objetos

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.

saludos,

j

Pues me parece que te equivocas. Acabo de mirar el log y esto es lo que
he
encontrado

e[4;36;1mPoll Load (0.000000)e[0m e[0;1mSELECT * FROM polls e[0m
Rendering test/index
e[4;35;1mPoll Columns (0.000000)e[0m e[0mSHOW FIELDS FROM pollse[0m
e[4;36;1mTag Load (0.000000)e[0m e[0;1mSELECT * FROM tags WHERE (
tags.poll_id = 1) e[0m
e[4;35;1mTag Load (0.031000)e[0m e[0mSELECT * FROM tags WHERE (
tags.poll_id = 2) e[0m
e[4;36;1mTag Load (0.000000)e[0m e[0;1mSELECT * FROM tags WHERE (
tags.poll_id = 3) e[0m
e[4;35;1mTag Load (0.000000)e[0m e[0mSELECT * FROM tags WHERE (
tags.poll_id = 4) e[0m
e[4;36;1mTag Load (0.016000)e[0m e[0;1mSELECT * FROM tags WHERE (
tags.poll_id = 5) e[0m

Por tanto, parece que lo que hace es una consulta de las tablas
relacionadas, por cada registro de la tabla principal.

El día 24/10/06, javier ramirez [email protected] escribió: