El caso que busca atacar es cuando por ejemplo tenés Programa has_many
:versiones, y le pedís Programa.find(1, :include => :versiones).
Supongamos que el Programa#1 tiene nombre "Foo", autor "Bar" y 5 versiones
("1.0" .. "5.0").
Con la forma vieja generaba la siguiente query sql (parafraseando, el SQL
generado depende del adapter, no suele usar estos nombres y usa LEFT JOIN):
SELECT p.id, p.nombre, p.autor, v.id, v.programa_id, v.numero
> FROM Persona p, Version v
> WHERE v.persona_id = p.id AND p.id = 1
>
esto trae algo así
| p.id | p.nombre | p.autor | v.id | v.programa_id | v.numero |
|------|----------|---------|------|---------------|----------|
>
| 1 | Foo | Bar | 11 | 1 | 1.0 |
> | 1 | Foo | Bar | 12 | 1 | 2.0 |
> | 1 | Foo | Bar | 13 | 1 | 3.0 |
> | 1 | Foo | Bar | 14 | 1 | 4.0 |
> | 1 | Foo | Bar | 15 | 1 | 5.0 |
>
Fijate como las columnas de Programa están repetidas. Este problema se hace
notable cuando tenés (1) mayor cantidad de columnas, o columnas más
"pesadas" o (2) cuando pedís includes anidados, por ejemplo:
Programa has_many :versiones
> Version has_many :source_files
>
> Programa.find 1, :include => { :versiones => :source_files }
>
el resultado del SQL generado con un único query repite ya muchas columnas,
y puede haber casos donde la performance sufra como consecuencia.
El approach de generar múltiples consultas evita este problema pero como
dijiste se complica cuando aparecen condiciones...
Saludos
Nacho
2008/6/23 Lucas Sallovitz <[EMAIL PROTECTED]>:
> 2008/6/21 Eduardo Trápani <[EMAIL PROTECTED]>:
> > Hola,
> >
> > Tengo Programa y Version, Programa has_many :versiones.
> >
> > Cuando hago:
> >
> > Programa.find(:all,:include => :versiones)
> >
> > El SQL que genera es:
> >
> > SELECT * FROM `programas`
> > SELECT `versiones`.* FROM `versiones` WHERE (`versiones`.programa_id IN
> > (1,2,3))
> >
>
> Un detalle no menor es que si antes tenías una consulta del tipo:
>
> Programa.find(:all,:include => :versiones, :conditions => {
> nroversion.empieza_con(1) })
>
> Ahora no va a funcionar de la manera que esperas, la forma de "forzar"
> un join es con:
>
> Programa.find(:all, :join => :versiones)
>
> Como ya se aclaró, según la gente de rails hacer dos selects
> normalmente es más rápido.
>
> Saludos. Lucas.
> _______________________________________________
> Ruby mailing list
> [email protected]
> http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar
>
_______________________________________________
Ruby mailing list
[email protected]
http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar