HABTM Self referential - only saves one way to join table

I’m completely stumped by this. Basically, I’ve got an HABTM self
referential model set up and for some reason the join table is only
saving relationships one way. To illustrate this:

member1 = Member.new
member2 = Member.new
member1.friends[0] = member2
member1.save
member2.friends[0] = member1
member2.save

Both saves return true in the console, but only the first actually is
written to the sqlite join table. I’ve tested a number of more in depth
examples, and in every case, I’m only able to get data saved in one
direction in the join table. For example:

member_id | friend_id
1 2
1 3
2 3
2 1 This won’t save
3 2 This won’t save either

In the console everything shows up correctly if I list .friends for any
object. But after restarting the console, only the uni-directional
entries remain.

Any help would be greatly appreciated! In my project I need to be able
to call .friends on any member and receive all members they are friends
with. Here’s my code:

    # Member object

class CreateMembers < ActiveRecord::Migration
def self.up
create_table :members do |t|
t.string :name
t.timestamps
end
end

def self.down
drop_table :members
end
end

  # Join table

class CreateMembersFriends < ActiveRecord::Migration
def self.up
create_table :members_friends, :id => false do |t|
t.integer :member_id
t.integer :friend_id
end
end

def self.down
end
end

  # Model

class Member < ActiveRecord::Base
has_and_belongs_to_many :friends,
:class_name => “Member”,
:join_table => “members_friends”,
:foreign_key => “member_id”,
:association_foreign_key => “friend_id”
end

Bob,

in HABTM are table names in alphabetical order, so your table name
should be friends_members…

tom

Bob Mr. wrote:

3 2 This won’t save either

  t.integer   :member_id

class Member < ActiveRecord::Base
has_and_belongs_to_many :friends,
:class_name => “Member”,
:join_table => “members_friends”,
:foreign_key => “member_id”,
:association_foreign_key => “friend_id”
end

Tomas Meinlschmidt, MS {MCT, MCP+I, MCSE, AER}, NetApp Filer/NetCache

  • experienced RoR/PHP freelancer, available for hire

www.meinlschmidt.com www.maxwellrender.cz www.lightgems.cz

Tom Z Meinlschmidt wrote:

Bob,

in HABTM are table names in alphabetical order, so your table name
should be friends_members…

tom

Bob Mr. wrote:

  t.integer   :member_id

class Member < ActiveRecord::Base
has_and_belongs_to_many :friends,
:class_name => “Member”,
:join_table => “members_friends”,
:foreign_key => “member_id”,
:association_foreign_key => “friend_id”
end

Thanks Tom, but unfortunately that doesn’t solve the problem. I need to
be able to get the friends of any member. Currently, the join table is
only saving it one way. So, for example with the join below, when I try
to get member2.friends, the result is nothing. If I try to get
member.friends, however, the result is [2, 3]. What I need is to be
able to call member2.friends and get the correct result of [1, 3]. Any
other ideas?

1 | 2
1 | 3
3 | 2