[Ror-es] Join

Damian Janowski damian.janowski at gmail.com
Wed Aug 8 12:30:02 GMT 2007


On 8/8/07, Miguel Angel Calleja Lázaro <mangelcl at yahoo.es> 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=?", at 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!


More information about the Ror-es mailing list