Has_many :through fails on n-way join


#1

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;
@@@