On 8/8/07, Miguel Angel Calleja Lázaro [email protected] wrote:
Es la primera vez que hago un join en ruby, ojeando lo primero que he
encontrado he hecho ésto:
@fotos=Foto.find(:all,:select=>“f.id,f.hidden,f.titulo,f.foto_grande,f.foto_peq,f.obra_id,f.descripcion,f.tipo,f.categoria_id,c.categoria”,
:conditions=>[“f.hidden=0 and f.tipo=0 and
f.obra_id=?”,@obra.id],:joins=>“as f left join categorias as c on
f.categoria_id=c.id”, :order=>“c.categoria”)
Funciona, pero quería saber si hay más maneras, alguna palabra mágica
que haga todo ésto y sea más sencillo, muchas gracias
Seguro que sí
@fotos = Foto.find(:all, :conditions => {:hidden => 0, :tipo => 0,
:obra_id => @obra.id}, :order => ‘categorias.categoria’, :include =>
:categorias)
Aunque las condiciones que estás aplicando parecen más lógica de
negocios… por lo que se podría hacer:
– app/models/foto.rb
class Foto < …
def self.visible(*args)
find(:all, (args[:conditions] || {}).merge({:hidden => 0, :tipo =>
0}), :order => ‘categorias.categoria’, :include => :categorias)
end
end
Entonces el uso:
@fotos = Foto.visible
Ahora bien, te falta el “filtro” por obra, pero varios recomiendan
usar las asociaciones, es más semántico:
@fotos = @obra.fotos.visible
(esto suponiendo que está definido el has_many :fotos en Obra)
Saludos!