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