Forum: Ruby on Rails self referential habtm using join tables

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.
0babf8dc63e63a6684706b1ef2e1b691?d=identicon&s=25 Randy Schmidt (Guest)
on 2006-02-25 23:26
(Received via mailing list)
All:

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 Fowler'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:

Migrations:

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

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

Models:

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

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

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",
"email"=>"x@altorg.com"}>
>> u1.acquaintances
=> [#<User:0x23722a8 @attributes={"name"=>"Randy", "id"=>"1",
"email"=>"x@altorg.com"}>]

and uses the following sql:

SELECT users.* FROM friends, users WHERE (users.id = 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 (users.id =
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",
"email"=>"x@altorg.com"}>
>> u2 = User.find(2)
=> #<User:0x2372cbc @attributes={"name"=>"Rebecca", "id"=>"2",
"email"=>"something@gmail.com"}>
>> 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 enver
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 leat
I think I know what the problem is, but I can't figure out the
solution.

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 Schmidt
x@altorg.com
267.334.6833
This topic is locked and can not be replied to.