# Has\_many + habtm on same model

**URL:** <https://www.ruby-forum.com/t/has-many-habtm-on-same-model/119969>\
**Category:** Rails\
**Created:** [November 12, 2007, 4:29pm UTC](https://www.ruby-forum.com/t/has-many-habtm-on-same-model/119969 "2007-11-12T16:29:51Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![unknown](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/u/4bbf92/32.png) [@unknown](https://www.ruby-forum.com/u/unknown)\
**Post date:** [November 12, 2007, 4:29pm UTC](https://www.ruby-forum.com/t/has-many-habtm-on-same-model/119969/1 "2007-11-12T16:29:51Z")

</div>

Hello,

In a situation where a user has\_many :groups (it owns the group) but  
also  
has\_and\_belongs\_to\_many :groups, how is this most easily represented?

The only way i have found is

user.rb:  
has\_many :groups  
has\_and\_belongs\_to\_many :memberships, ,:join\_table =\> ‘memberships’,  
:class =\> ‘group’

group.rb  
belongs\_to :user  
has\_and\_belongs\_to\_many :memberships, , :join\_table =\> ‘memerships’,  
:class =\> ‘user’

I think there is an opportunity to have a new model membership.rb that  
belongs\_to :user, belongs\_to :group where a user has\_many :groups,  
:through  
=\> :membership but not 100% sure.

What is the cleanest approach here?

Adam

---

<div class="post-metadata">

**Author:** ![unknown](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/u/4bbf92/32.png) [@unknown](https://www.ruby-forum.com/u/unknown)\
**Post date:** [November 12, 2007, 6:42pm UTC](https://www.ruby-forum.com/t/has-many-habtm-on-same-model/119969/2 "2007-11-12T18:42:07Z")

</div>

unknown wrote:

> Hello,
> 
> In a situation where a user has\_many :groups (it owns the group) but  
> also  
> has\_and\_belongs\_to\_many :groups, how is this most easily represented?
> 
> The only way i have found is
> 
> user.rb:  
> has\_many :groups  
> has\_and\_belongs\_to\_many :memberships, ,:join\_table =\> ‘memberships’,  
> :class =\> ‘group’
> 
> group.rb  
> belongs\_to :user  
> has\_and\_belongs\_to\_many :memberships, , :join\_table =\> ‘memerships’,  
> :class =\> ‘user’
> 
> I think there is an opportunity to have a new model membership.rb that  
> belongs\_to :user, belongs\_to :group where a user has\_many :groups,  
> :through  
> =\> :membership but not 100% sure.
> 
> What is the cleanest approach here?

User:  
has\_many :owned\_groups, :class\_name =\> “Group”  
has\_many :memberships, :dependent\_destroy  
has\_many :groups, :through =\> :memberships

Group:  
belongs\_to :owner, :class\_name =\> “User”  
has\_many :memberships, :dependent\_destroy  
has\_many :users, :through =\> :memberships

That’s how I’d do it. You want to keep the association names distinct  
(and meaningful too).

–  
Josh S.  
[http://blog.hasmanythrough.com](http://blog.hasmanythrough.com)
