Forum: Ruby on Rails has_many :through fails on n-way 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.
Andy K. (Guest)
on 2008-12-09 18:50
(Received via mailing list)
I think this is a Rails bug, but I'd like to describe it here first -
in case I'm doing something wrong.

When using an n-way (has_many :through) join, the wrong model attr is
selected when evaluating the join relationship.

Consider the following models.  User, Group, Customer represent a
standard HMT relationship.  User, Group, Build (UGB) is an n-way style
join - where the relationship between Users and Builds is possible
since Builds belong to Customers who are joined to Users.  Note the
additional attributes to the HMT in the Build model (ie, :foreign_key
& :primary_key).

@@@
class User < ActiveRecord::Base
  has_many :groups
  has_many :customers, :through => :groups
end

class Group < ActiveRecord::Base
  belongs_to :user
  belongs_to :customer
end

class Customer < ActiveRecord::Base
  has_many :builds

  has_many :groups
  has_many :members, :through => :groups, :source => :user
end

class Build < ActiveRecord::Base
  belongs_to :customer

  has_many :groups, :foreign_key => :customer_id, :primary_key
=> :customer_id
  has_many :accessors, :through => :groups, :source => :user
end
@@@

The problem is that the @build.accessors results in an empty [] -
because the SQL is using the @build.id rather than
@build.customer_id.  See related SQL listings...
@@@
User Load (2.6ms)   SELECT * FROM "users" WHERE ("users"."login" =
E'hp_person') LIMIT 1
Customer Load (2.5ms)   SELECT "customers".* FROM "customers" INNER
JOIN groups ON customers.id = groups.customer_id WHERE
(("groups".user_id = 1046015453)) LIMIT 1
Build Load (2.4ms)   SELECT * FROM "builds" WHERE
("builds".customer_id = 807266524)
User Exists (11.5ms)   SELECT "users".id FROM "users" INNER JOIN
groups ON users.id = groups.user_id WHERE ("users"."id" = 1046015453)
AND (("groups".customer_id = 192574979)) LIMIT 1
@@@

@@@
builds table:
:id => 192574979;
:customer_id => 807266524;
@@@
This topic is locked and can not be replied to.