Tengo un :include que genera un outer join.  El tema es que tengo que
ponerle una condición al ON del join:

User.find :all, :include => :addresses, :conditions => ["addresses.is_active
= 1"]

Ojo que el comportamiento de :include cambió...

En realidad cambia si no hay condiciones sobre la otra tabla, si hay se pasa al 
modo anterior, al join.

Pero esto no te funciona?

User.find :all, :include => :addresses, :joins => 'LEFT OUTER JOIN
addresses ON addresses.user_id = users.id AND addresses.is_active =
1', :conditions => ["addresses.is_active = 1"]

Algo así andaría, pero el tema es que tengo :includes anidados y no miré cómo 
anidar :joins.  El código actual que anda (está en otro idioma pero creo que se 
entiende) es:

primero creo el has_many 'on the fly', durante a ejecución ("tradukadoj_laux_lingvo" es 
"traducciones por idioma" y :tradukado es un join model, :lingvo es idioma y :tradukoj 
las traducciones reales.):

   Frazo.has_many "tradukadoj_laux_lingvo".to_sym,:foreign_key => :originalo_id,
   :class_name => 'Tradukado',:conditions => ['tradukadoj.lingvo_id = 
?',self.al_lingvo.id]

y después obtengo las frases que me interesan usando el has_many que recién 
creé.  Al hacerlo así el join recibe la condición adicional.

   @frazoj = kunteksto.frazoj.find(:all,
   :include => [:teksto,{:tradukadoj_laux_lingvo => {:traduko => :teksto}}])

Lo genial de agregar el has_many, que así anda, es que con el eager loading la 
vista no necesita ni un solo dato más, tiene todo a mano.  Lo malo es que no sé 
el impacto real de andar agregando el has_many, por ahora a ciegas en cada 
request.  Tendría que usar algún tipo de reflection para saber si ya está o no, 
prender una bandera, darle un nombre diferente según el idioma ... no sé, a eso 
no llegué.

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

Responder a