Forum: Ruby on Rails self-referential joins with :through raises TypeError

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Taylor S. (Guest)
on 2009-01-02 19:36
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?
Frederick C. (Guest)
on 2009-01-02 19:40
(Received via mailing list)
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
Taylor S. (Guest)
on 2009-01-02 19:53
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. (Guest)
on 2009-01-02 20:22
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.
Taylor S. (Guest)
on 2009-01-02 21:26
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?
itsastickup (Guest)
on 2009-01-05 19:41
(Received via mailing list)
Hi Taylor, Did you solve this problem? I have exactly the same. Greg

On 2 Jan, 20:26, Taylor S. <removed_email_address@domain.invalid>
Taylor S. (Guest)
on 2009-01-05 21:21
Never fixed it :(
Ryan B. (Guest)
on 2009-01-05 23:00
(Received via mailing list)
Frederick C. (Guest)
on 2009-01-05 23:06
(Received via mailing list)
On Jan 5, 7:21 pm, Taylor S. <removed_email_address@domain.invalid>
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
This topic is locked and can not be replied to.