# Has\_many conversely

**URL:** <https://www.ruby-forum.com/t/has-many-conversely/103252>\
**Category:** Rails\
**Created:** [May 3, 2007, 12:29pm UTC](https://www.ruby-forum.com/t/has-many-conversely/103252 "2007-05-03T12:29:37Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![kane](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/76d3ee/32.png) [@kane](https://www.ruby-forum.com/u/kane)\
**Post date:** [May 3, 2007, 12:29pm UTC](https://www.ruby-forum.com/t/has-many-conversely/103252/1 "2007-05-03T12:29:37Z")

</div>

I have a very simple association:  
class User \< ActiveRecord::Base  
has\_and\_belongs\_to\_many :friends,  
:class\_name=\>“User”,  
:join\_table=\>“friends\_users”,  
:association\_foreign\_key=\>“friend\_id”,  
:foreign\_key=\>“user\_id”

User.friends - returns my friends. How can i get users who “friended”  
me?  
Thanks.

---

<div class="post-metadata">

**Author:** ![kane](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/76d3ee/32.png) [@kane](https://www.ruby-forum.com/u/kane)\
**Post date:** [May 3, 2007, 1:47pm UTC](https://www.ruby-forum.com/t/has-many-conversely/103252/2 "2007-05-03T13:47:07Z")

</div>

Add a similar habtm to Friend ?

Fred

---

<div class="post-metadata">

**Author:** ![kane](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/76d3ee/32.png) [@kane](https://www.ruby-forum.com/u/kane)\
**Post date:** [May 3, 2007, 3:41pm UTC](https://www.ruby-forum.com/t/has-many-conversely/103252/3 "2007-05-03T15:41:37Z")

</div>

FriendUser.find(:all, :conditions =\> [‘friend\_id = ?’,user.id  
]).collect{|x|x.user}

so I think you can put that in a model function

def befriended\_ones  
FriendUser.find(:all, :conditions =\> [‘friend\_id = ?’,user.id  
]).collect{|x|x.user}  
end

I would like to know if there is a way of doing this just using  
associations…

---

<div class="post-metadata">

**Author:** ![kane](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/76d3ee/32.png) [@kane](https://www.ruby-forum.com/u/kane)\
**Post date:** [May 3, 2007, 4:12pm UTC](https://www.ruby-forum.com/t/has-many-conversely/103252/4 "2007-05-03T16:12:41Z")

</div>

Right, Ivor. I knew about this way, and also would like to know if  
there is a way to do it through associations. And another issue, i  
have rich join model via has\_many :through. And collection’s clear  
(user.groups.clear) method works strange. It just clears collection in  
memory and doesn’t touch join table at all. Even not nullify foreign  
keys, nothing. Is it expected?

---

<div class="post-metadata">

**Author:** ![kane](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/76d3ee/32.png) [@kane](https://www.ruby-forum.com/u/kane)\
**Post date:** [May 3, 2007, 4:53pm UTC](https://www.ruby-forum.com/t/has-many-conversely/103252/5 "2007-05-03T16:53:48Z")

</div>

Did you try reversing the habtm relationship manually:  
has\_and\_belongs\_to\_many :friended,  
:class\_name =\> “User”  
:join\_table =\> “friends\_users”,  
:association\_foreign\_key =\> “user\_id”,  
:foreign\_key =\> “friend\_id”

You could build a plugin or function that did both ways, if you use  
self-relations like this often. Otherwise, I don’t know anything  
built into Rails that does it both ways.

- Hal

---

<div class="post-metadata">

**Author:** ![kane](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/76d3ee/32.png) [@kane](https://www.ruby-forum.com/u/kane)\
**Post date:** [May 4, 2007, 9:39am UTC](https://www.ruby-forum.com/t/has-many-conversely/103252/6 "2007-05-04T09:39:49Z")

</div>

It’s really simple! How i didn’t come to this from the beginning. From  
the 1st sight i think it should work.  
P.S fast test shows - it really works.

---

<div class="post-metadata">

**Author:** ![kane](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/76d3ee/32.png) [@kane](https://www.ruby-forum.com/u/kane)\
**Post date:** [May 3, 2007, 5:02pm UTC](https://www.ruby-forum.com/t/has-many-conversely/103252/7 "2007-05-03T17:02:50Z")

</div>

Kane,  
I would appreciate it if you could give this a spin and let me know if  
it  
worked.  
thanks  
Ivor
