# HABTM Self referential - only saves one way to join table

**URL:** <https://www.ruby-forum.com/t/habtm-self-referential-only-saves-one-way-to-join-table/168106>\
**Category:** Rails\
**Created:** [May 16, 2009, 12:19am UTC](https://www.ruby-forum.com/t/habtm-self-referential-only-saves-one-way-to-join-table/168106 "2009-05-16T00:19:56Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![bobm](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/9fc348/32.png) [@bobm](https://www.ruby-forum.com/u/bobm)\
**Post date:** [May 16, 2009, 12:19am UTC](https://www.ruby-forum.com/t/habtm-self-referential-only-saves-one-way-to-join-table/168106/1 "2009-05-16T00:19:56Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![bobm](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/9fc348/32.png) [@bobm](https://www.ruby-forum.com/u/bobm)\
**Post date:** [May 16, 2009, 12:43am UTC](https://www.ruby-forum.com/t/habtm-self-referential-only-saves-one-way-to-join-table/168106/2 "2009-05-16T00:43:05Z")

</div>

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](http://www.meinlschmidt.com) www.maxwellrender.cz www.lightgems.cz

---

<div class="post-metadata">

**Author:** ![bobm](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/9fc348/32.png) [@bobm](https://www.ruby-forum.com/u/bobm)\
**Post date:** [May 16, 2009, 4:13am UTC](https://www.ruby-forum.com/t/habtm-self-referential-only-saves-one-way-to-join-table/168106/3 "2009-05-16T04:13:40Z")

</div>

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
