Hola gente,

Después de un tiempo como "voyeur", voy a hacer mis primera consulta al grupo. Creo que es una tontería de principiante, y la verdad es que quería iniciarme en una consulta de mayor nivel ;-( pero bueno, aquí voy... Pido disculpas por lo largo del mail.

Tengo dos tablas, "clientes" y "hosts", mapeadas a través de ActiveRecord a clases Cliente y Host, según una relación "Cliente <1:n> Host".

Utilizando un find convencional con joins y select, hago:

@hosts = Host.find(:all, :joins => "as h inner join clientes as c on c.id=h.cliente_id, :select => "h.*, c.nombre")

Lo que obtengo es la lista de hosts que cumplen con el join, pero no me está incluyendo el "c.nombre", cosa que necesito.

Por otro lado, una consulta como esta, sin el :select me da error:

@hosts = Host.find(:all, :joins => "as h inner join clientes as c on c.id=h.cliente_id")

ActiveRecord::StatementInvalid: Mysql::Error: Unknown table 'hosts': SELECT `hosts`.* FROM `hosts` as h inner join clientes as c on h.cliente_id=c.id from /Users/lean/.gem/ruby/1.8/gems/activerecord-2.3.4/lib/ active_record/connection_adapters/abstract_adapter.rb:219:in `log' from /Users/lean/.gem/ruby/1.8/gems/activerecord-2.3.4/lib/ active_record/connection_adapters/mysql_adapter.rb:319:in `execute' from /Users/lean/.gem/ruby/1.8/gems/activerecord-2.3.4/lib/ active_record/connection_adapters/mysql_adapter.rb:604:in `select' from /Users/lean/.gem/ruby/1.8/gems/activerecord-2.3.4/lib/ active_record/connection_adapters/abstract/database_statements.rb:7:in `select_all_without_query_cache' from /Users/lean/.gem/ruby/1.8/gems/activerecord-2.3.4/lib/ active_record/connection_adapters/abstract/query_cache.rb:62:in `select_all' from /Users/lean/.gem/ruby/1.8/gems/activerecord-2.3.4/lib/ active_record/base.rb:661:in `find_by_sql' from /Users/lean/.gem/ruby/1.8/gems/activerecord-2.3.4/lib/ active_record/base.rb:1548:in `find_every' from /Users/lean/.gem/ruby/1.8/gems/activerecord-2.3.4/lib/ active_record/base.rb:615:in `find'
        from (irb):1

Entiendo que el error me lo dá la base de datos, puesto que no le gusta el SELECT "`hosts`.*".

Una expresión con un :joins de la siguiente manera, no me da error, pero tampoco me da las columnas de la otra tabla...

@hosts = Host.find(:all, :joins => [:cliente])


Tal vez entendí mal, pero esto debería funcionar dandome no sólo los campos de host, sino tambien los de las tablas incluídas en :joins, no es así?

Por último, la expresión @hosts[0].cliente.nombre o @hosts.first.cliente.nombre me da lo que busco, pero realiza consultas adicionales a la base que en este caso pequeño no sería problema, pero sí con tablas que manejan varios millones de registros tal como ocurre con otras de mis tablas.

Estoy usando Rails 2.3.4.

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

Responder a