Left Join


#1

Como puedo hacer un left join en un find, pues con :include => [:ZZZZ]
me hace un inner join

muchas gracias!


#2

Como puedo hacer un left join en un find, pues con :include => [:ZZZZ]
me hace un inner join

Puedes usar la opción :joins
A.find(:all, :joins => “LEFT JOIN B on B.a_id = id” )

HTH


#3

ya pero no queria recurrir a esto

2009/4/9 Juanjo Bazán removed_email_address@domain.invalid:


#4

Como puedo hacer un left join en un find, pues con :include => [:ZZZZ]
me hace un inner join

Include no hace un inner join… en versiones antiguas de rails include
hace un outer join. En versiones modernas include hace una segunda query
para la tabla incluída donde pone como condición que la foreign_key sea
uno de los IDs que ha recuperado en la query de la tabla principal.

El efecto es el mismo que en una outer, pero con la ventaja de que ocupa
mucha menos memoria.

Solamente en el caso de que tus conditions incluyan campos de la tabla
incluída (que tienen que ir en la forma nombre_tabla.nombre_campo aunque
el nombre de campo sea único) las versiones modernas de Rails se
comportarán como hacían antes y lanzarán una outer join.

Pero en ninguno de los casos tiran de inner por defecto (creo :stuck_out_tongue: )

Si necesitas controlar exactamente cómo se hacen las joins, me temo que
tendrás que recurrir a la claúsula :join de active record. Lo malo de
usar join es que la estructura de lo que devuelve no es tan limpia como
en un find estándar con include.

saludos,


javier ramírez

…i do ruby on rails development in madrid, spain, at
http://www.aspgems.com
…you can find out more about me on http://formatinternet.wordpress.com
and http://workingwithrails.com/person/5987-javier-ramirez


#5

cometi un error al escrivir el post inicial, yo me referia a hacer un
:joins => [:XXX]
que entonces siempre me hace un inner join, y en algún caso me
gustaria hacer un left join

perdon…

2009/4/9 javier ramirez removed_email_address@domain.invalid:


#6

Las consultas con join son un arma peligrosa, y si tenemos activerecord
de
por medio aún más. Yo en casos complejos tiro de find_by_sql y así la
consulta hace exactamente lo que yo quiero y no tengo sorpresas.

2009/4/9 LLeïr Borràs removed_email_address@domain.invalid