On Apr 7, 2010, at 10:05 PM, NachoKB wrote:

2010/4/7 Lean <[email protected]>
Digo:

Host.find(:all, :include => [:cliente])
y
Host.find(:all, :joins => [:cliente])

da exáctamente el mismo resultado. O sea, sólo las columnas de Host.

los objetos Host que te retornan son "los mismos" en el sentido de que no te va a devolver un host que tiene el nombre de Cliente (y, sigo insistiendo, no querés que así sea).

Particularmente en este caso, el caso de joins no agrega nada (por que el joins sólo te "habilita" columnas para el :conditions), es como si no estuviera la opción

Dicho de otra forma:

@hosts = Host.all
@hosts.each { |host| puts host.cliente.nombre }

genera N+1 query

@hosts = Host.all :include => :cliente
@hosts.each { |host| puts host.cliente.nombre }

genera 2 (DOS) queries: "eager loading" es :include

fijate que el código que utiliza la lista de hosts no cambia...

nachokb
_______________________________________________
Ruby mailing list
[email protected]
http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar




Gente, el tema está resuelto.

Sólo basta comprender la utilidad de hacer eager loading utilizando :include, donde en mi caso la cantidad de queries se redujo considerablemente y ahora -a pesar de manejar tablas con muchos registros- el tema se hace mucho más manejable y sobre todo, con mejoras interesantes de performance.

Estaba más acostumbrado a manejar consultas con muchos joins y obtener frankesteins que no tienen relación con los objetos directamente, sino están más pegados al modelo de la base de datos.

Muchas gracias a todos,
Leandro.







_______________________________________________
Ruby mailing list
[email protected]
http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar

Responder a