# Has\_many, through with multiple nested models?

**URL:** <https://www.ruby-forum.com/t/has-many-through-with-multiple-nested-models/182362>\
**Category:** Rails\
**Created:** [January 27, 2010, 1:52am UTC](https://www.ruby-forum.com/t/has-many-through-with-multiple-nested-models/182362 "2010-01-27T01:52:40Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![lunaclaire](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/l/f4b2a3/32.png) [@lunaclaire](https://www.ruby-forum.com/u/lunaclaire)\
**Post date:** [January 27, 2010, 1:52am UTC](https://www.ruby-forum.com/t/has-many-through-with-multiple-nested-models/182362/1 "2010-01-27T01:52:40Z")

</div>

First the data model, then the question:

running Rails 2.2.3, I have

class Forum \< ActiveRecord::Base  
has\_many :topics, :dependent  
=\> :destroy, :order =\> ‘created\_at  
desc’  
end

class User \< ActiveRecord::Base  
has\_many :topics, :dependent =\> :destroy  
has\_many :comments, :dependent =\> :destroy  
has\_many :replies, :dependent =\> :destroy  
end

class Topic \< ActiveRecord::Base  
belongs\_to :forum  
belongs\_to :user  
has\_many :comments, :dependent =\> :destroy  
end

class Comment \< ActiveRecord::Base  
belongs\_to :user  
belongs\_to :topic  
has\_many :replies, :dependent =\> :destroy  
end

class Reply \< ActiveRecord::Base  
belongs\_to :user  
belongs\_to :comment  
end

So Users can post Topics to Forums. They can also post Comments to the  
Topics in a Forum. And they can post Replies to the Comments.

I want to be able to get a list of Forums they’ve participated in by  
posting either Topics or Comments or Replies.

I could just create a Membership that would relate a User to a Forum  
whenever they post something, but then I’d need to maintain the  
Membership when/if they delete their last Post/Comment/Reply from a  
given Forum. That seems messy.

what I’m wonder is if I can do something like this:

class User \< ActiveRecord::Base  
has\_many :topics, :dependent =\> :destroy  
has\_many :comments, :dependent =\> :destroy  
has\_many :replies, :dependent =\> :destroy

```
    has_many :forums, :through => :topics, :uniq =>

```

true  
has\_many :forums, :through =\> :comments, :uniq  
=\> true  
has\_many :forums, :through =\> :replies, :uniq  
=\> true

end

I dont think so… Only the Topic model is directly associated with  
the Forum.

Is there a clean way to do a HMT association on multiple, nested  
associations like this?

---

<div class="post-metadata">

**Author:** ![lunaclaire](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/l/f4b2a3/32.png) [@lunaclaire](https://www.ruby-forum.com/u/lunaclaire)\
**Post date:** [February 1, 2010, 4:13pm UTC](https://www.ruby-forum.com/t/has-many-through-with-multiple-nested-models/182362/2 "2010-02-01T16:13:21Z")

</div>

Since topic, comment and reply are sharing a lot of the same fields as  
well as some logic, I reckon I’d make a superclass here for the three of  
them.  
Topic, comment and reply are basically the same thing, right? A post.

By using a superclass you can base logic like finding which forums a  
user has topics, comments and replies in off of User.posts.
