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

Responder a