Forum: Ruby on Rails Getting the wrong ID field in a join

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
monch1962 (Guest)
on 2005-12-08 12:04
(Received via mailing list)
Hello everyone,

I've got the following scenario

Controller
@things = Thing.find_all
@thing_pages, @things = paginate :things, :per_page => 10, :order_by
=> 'otherthings.otherthingname, thingname', :joins => [',otherthings
where things.id = otherthings.thing_id']

View
for thing in @things
  <%= thing.id %>
  <%= thing.thingfield1 %>

What I'd expect to see is a list of the id fields for records in the
**things** table; instead I'm seeing a list of the id fields for
records in the **otherthings** table.  However, 'thing.thingfield1'
gives exactly what I want - a list of the thingfield1 fields for
records in the things table.

It seems that the join in the controller code has picked up the id
field from the otherthings table, rather than the id field from the
things table.  I've confirmed that the model definitions for both
'things' and 'otherthings' is correct.

Has anyone else encountered this, and/or know of a way around it?  I'm
using this block of code all over the place (with different table
names) in my app, and it's working perfectly everywhere except this
one place.

Thanks in advance

Dave M.
ij.list (Guest)
on 2005-12-08 15:01
(Received via mailing list)
You need to add :select => 'things.*' to pagination options. This
happens because there are more than one columns with name
'id' (things.id and otherthings.id). Which column will prevail is
quite a gamble without qualification...

izidor
Bruce B. (Guest)
on 2005-12-08 17:17
(Received via mailing list)
Yes, I encountered it. The id for the second table has the same name
as the first and thus the first is ovewritten by the second. No
problem.  You use :select=> and then when you select the id column of
the second table you change its name like

secondtable.id as 'foo_id'

bruce
monch1962 (Guest)
on 2005-12-08 23:19
(Received via mailing list)
Thanks guys, that did the trick.

Just curious: how did you track down that solution?  The :select
option isn't covered in the API at
http://rails.rubyonrails.com/classes/ActionControl...
which is where I was looking, so is there another source of info I
should be searching as well?

Or did you just walk through the code and find the option that way?

Thanks again

Dave M.
Bruce B. (Guest)
on 2005-12-08 23:43
(Received via mailing list)
Well.  I had the same problem, wrote to the list and got an answer
from David Heinemeier H..  Very cool that he should bother to
answer.  So, what goes around comes around. I figured it was my turn
to be helpful.

bruce
This topic is locked and can not be replied to.