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