self-referential joins with :through raises TypeError

I have a simple referral system composed of Users and Referrals.

The users table has an id value, of course. The referrals table has referer_id and referee_id. The relationships are set up as follows:

class User < ActiveRecord::Base   has_many :referrals,             :foreign_key => "referer_id"

  has_one :referer,           :through => :referrals,           :source => :referer

  has_many :referees,             :through => :referrals,             :source => :referee

class Referral < ActiveRecord::Base   belongs_to :referer,               :class_name => :user,               :foreign_key => "referer_id"

  belongs_to :referee,           :class_name => :user,           :foreign_key => "referee_id"

Most of this works. User.referrals returns all the referral objects. Referral.referer and Referral.referee both return the appropriate objects. But the User.referer/referee methods both raise the same error:

user.referer

TypeError: can't convert Symbol into String

I would like User.referer to return the single user object that is their referer. And User.referees would return an array of user objects that were refered. What am I doing wrong here?

class Referral < ActiveRecord::Base belongs_to :referer,              :class_name => :user,              :foreign_key => "referer_id"

belongs_to :referee,          :class_name => :user,          :foreign_key => "referee_id"

Most of this works. User.referrals returns all the referral objects. Referral.referer and Referral.referee both return the appropriate objects. But the User.referer/referee methods both raise the same error:

The class_name option should really be a string (ie :class_name =>
'User')

Fred

The SQL generated by user1.referer is

SELECT "users".* FROM "users" INNER JOIN referrals ON users.id = referrals.referer_id WHERE (("referrals".referer_id = 1))

But it should be using WHERE referrals.referee_id = 1 instead of referer_id = 1. I've tinkered with various permutations but cannot make it query for users.id = referer_id WHERE referee_id = x. Any thoughts?

Never fixed it :frowning:

If referrals are all the referrals made by that user (since it uses the referer_id foreign key) it seems to me that will never get you a user's referer (unless the use referred themselves).

You'd want to go through the referrals table using the other key.

Fred