Tablas muy grandes y consumo de memoria

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