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?
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 
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