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?

On 2 Jan 2009, at 17:36, Taylor S. wrote:

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

Frederick C. wrote:

On 2 Jan 2009, at 17:36, Taylor S. wrote:

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

Thanks that solved the issue.

Taylor S. wrote:

Frederick C. wrote:

On 2 Jan 2009, at 17:36, Taylor S. wrote:

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’)

Actually I spoke too soon. User.referer always returns nil, even if
there is a referral record with appropriate referee_id and referer_id.
Also, if I do user1.referer = user2 a NoMethodError is raised:

NoMethodError: undefined method `update_attributes’ for
#Class:0x237de24

User.referees does correctly return an array of user objects, though.

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:

Hi Taylor, Did you solve this problem? I have exactly the same. Greg

On 2 Jan, 20:26, Taylor S. [email protected]

On Jan 5, 7:21 pm, Taylor S. [email protected]
wrote:

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

frozenplague.net

Ryan B.
Freelancer