Hola, supongamos que tengo una tabla con muchas entradas, pero que la
aplicación web en Rails nunca va a tener que acceder a toda ella,
ya que hay una columna “cliente”, y a cada cliente sólo se le van a
mostrar vÃa web las entradas de la tabla que tengan dicho campo
“cliente” con su valor.
Mi pregunta es: ¿hay alguna forma de hacer que Rails nunca trate de
cargar todas las entradas y pasarlas a memoria en forma de objetos y
que sólo cargue las entradas del cliente?
Sobre todo tengo un poco de miedo porque tengo entendido que el
“find_all” carga todo a lo bruto.
¿Qué precauciones tendrÃa que tener en consideración para evitar que
cargue todas las entradas de la tabla a memoria en forma de objetos?
Gracia por cualquier aclaración y un saludo.
On Wed, Oct 10, 2007 at 11:26:14AM +0200, Iñaki Baz C. wrote:
“find_all” carga todo a lo bruto.
Para empezar, el método “find_all” está obsoleto. En todo caso, deberías
invocar al método “find” de la siguiente forma: “find(:all)”.
A bote pronto, puedes hacer eso de un par de formas diferentes. Lo
mássencillo sería usar la opción “:conditions” del método find.
Otra idea sería, si tuvieras un modelo “Cliente” y otro “Dato” (este
último corresponde a esta tabla grande de la que hablas), puedes tener
una relación 1 a muchos y hacer algo como esto:
c = Cliente.find(params[:id]) # o como sea que localizas el cliente
c.datos # y sólo recuperaría los objetos de la clase Dato
# correspondientes al cliente “c”
Incluso puedes hacer “finds” sobre esa
relación:
c.datos.find(:first)
Así no se cargarían en memoria todos los objetos Dato. Espero que te
sirva.
Saludos.
–
Imobach González Sosa
Banot.net
imobachgs en banot punto net
osoh en jabberes punto org
El 10/10/07, Imobach González Sosa [email protected] escribió:
Sobre todo tengo un poco de miedo porque tengo entendido que el
una relación 1 a muchos y hacer algo como esto:
sirva.
De acuerdo, entendido, muchas gracias.
On 10/10/07, Iñaki Baz C. [email protected] wrote:
Hola, supongamos que tengo una tabla con muchas entradas, pero que la
aplicación web en Rails nunca va a tener que acceder a toda ella,
ya que hay una columna “cliente”, y a cada cliente sólo se le van a
mostrar vía web las entradas de la tabla que tengan dicho campo
“cliente” con su valor.
Me huele a que te vendría bien alguno de los plugins que manejan
“cuentas”. No los probé, pero entiendo que estos plugins permiten que
todas las consultas a tu modelo se ejecuten dentro de un #with_scope,
lo que hace que siempre se agregue una condición - por ejemplo,
cliente_id = X.
http://agilewebdevelopment.com/plugins/account_location
http://agilewebdevelopment.com/plugins/scopecontrollermodel