SELECT users.*, addresses.* FROM users LEFT OUTER JOIN addresses ON
addresses.user_id = users.id and addresses.is_active = 1 WHERE NOT
addresses.address_id = null

No debería ser mucho peor que lo que vos propones. En otras palabras,
que pasa si mandás algo así:

User.find :all, :include => :addresses, :conditions =>
["addresses.is_active = 1 and (not null(addresse.address_id))"]

Pasa que ambas condiciones se van para el Where.  Ése es el problema que tengo, 
no tengo cómo decir que una condición vaya al join.  Al quedar las dos en el 
where en realidad la segunda está implicada por la primera, es decir, si hay un 
campo que no es nulo (is_active) entonces es que se encontró un registro.

La idea es, obvio, no tener que usar find_by_sql ...

has_many :active_addresses, :class_name => :address, :conditions =>
['addresses.is_active = ?',@address_status]

El problema con ese enfoque es cuando se evalúa la variable, si
funciona igual que con named_scope, tendrías que usar un lambda para
que se evalúe cada vez que ejecutás el método correspondiente, pero en
ese caso por ahí es más simple definir un método, y usar un parámetro.

Sí, el método es lo más fácil en general.  Podés extender la relación, pero 
para que el join incorpore la condición necesita que ésta esté en la 
asociación, lo cual tiene lógica.

No sabía qué era un lambda, así que lo estudié.  No me doy cuenta cómo se 
podría usar ...

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

Responder a