Forum: Ruby on Rails self-referential many-to-many using a join model

Announcement (2017-05-07): is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see and for other Rails- und Ruby-related community platforms.
Randy S. (Guest)
on 2006-02-27 19:28
(Received via mailing list)

I have been working on making a self-referential habtm relationship
that uses a join model because I want to store info about the
relationship. I have been using two sections from Chad F.'s "Rails
Recipes" as a guide, "Self-referential Many-to-Many Relationships" and
"Many to Many Relationships Where the Relationship Itself has Data".
So far I have had little luck. Here is what I have that works a
little, but not really:

create_table "users" do |t|
   t.column "name", :string
   t.column "email", :string

create_table "friends" do |t|
     t.column "user_id", :integer
     t.column "acquaintance_id", :integer
     t.column "approved", :integer


class Friend < ActiveRecord::Base
 belongs_to :users
 belongs_to :friends

class User < ActiveRecord::Base
 has_many :friends
 has_many :acquaintances, :through => :friends,
   :class_name => "User"

I can't figure out those declarations to get it to work like a join
model. With that setup, I add a record to the friends table that has
the attributes I want (so I can see if I can access the info
correctly) - user_id = 1 acquaintance_id = 2 approved = 0

>> u1 = User.find(1)
=> #<User:0x23754e4 @attributes={"name"=>"Randy", "id"=>"1",
>> u1.acquaintances
=> [#<User:0x23722a8 @attributes={"name"=>"Randy", "id"=>"1",

and uses the following sql:

SELECT users.* FROM friends, users WHERE ( = friends.user_id
AND friends.user_id = 1)

which is close to what I want, but I believe it should be the following:

SELECT users.* FROM friends, users WHERE ( =
friends.acquaintance_id AND friends.user_id = 1)

now I delete that record to try to create that row using ruby

>> u1 = User.find(1)
=> #<User:0x23754e4 @attributes={"name"=>"Randy", "id"=>"1",
>> u2 = User.find(2)
=> #<User:0x2372cbc @attributes={"name"=>"Rebecca", "id"=>"2",
>> friend = Friend.create(:approved => 0)
=> #<Friend:0x23700ac @attributes={"id"=>9, "approved"=>0,
"acquaintance_id"=>nil, "user_id"=>nil},
@errors=#<ActiveRecord::Errors:0x236e57c @errors={},
@base=#<Friend:0x23700ac ...>>, @new_record=false>
>> u1.friends << friend
=> [#<Friend:0x23700ac @attributes={"id"=>9, "approved"=>0,
"acquaintance_id"=>nil, "user_id"=>1},
@errors=#<ActiveRecord::Errors:0x236e57c @errors={},
@base=#<Friend:0x23700ac ...>>, @new_record=false>]
>> u2.friends << friend
=> [#<Friend:0x23700ac @attributes={"id"=>9, "approved"=>0,
"acquaintance_id"=>nil, "user_id"=>2},
@errors=#<ActiveRecord::Errors:0x236e57c @errors={},
@base=#<Friend:0x23700ac ...>>, @new_record=false>]

Here is what I think the problem is. with a normal join model, there
are two different types of objects being joined, ie readers and
magazines (to steal the example). With what I am doing, both u1 and u2
are User objects, making it so that user_id is always set, but never
acquaintance_id. I tried setting association_foreign_key =>
"acquaintance_id" and foreign_key => "user_id", but that doesn't work.
I have been trying to work this out but have had zero success. At least
I think I know what the problem is, but I can't figure out the

One thing I was thinking is maybe making an Acquaintance model that
inherits from User so that they are two different object types, but I
don't know if that is possible or if that is a good way to do it.

Any help would be greatly appreciated!

Thank you!
Randy S.
This topic is locked and can not be replied to.