What you're looking for is a named scope in the Forum model.
The join can be greatly simplified by adding has_many :through relationships for your Comment and Reply models in the Forum model. But I can never remember how nested joins work out, so I've posted a solution that will work with what you've got.
class Forum < ActiveRecord::Base
has_many :topics, :dependent => :destroy, :order => 'created_at desc'
named_scope :user_posted, lambda {|user|
{ :joins => "JOIN topics t ON t.forum_id = forums.id " +
"JOIN comments c ON c.topic_id = t.id " +
"JOIN replies r ON r.comment_id = c.id",
:conditions => ["t.user_id = ? OR c.user_id = ? OR r.user_id = ?",
user, user, user],
:group => "forums.id"
}
}
end
Now...
Forum.user_posted(@user)
Will return an array of forums where a user has posted a topic, reply or comment.
For a list of forums a particular user has posted in:
class User < ActiveRecord::Base
has_many :topics, :dependent => :destroy
has_many :comments, :dependent => :destroy
has_many :replies, :dependent => :destroy
named_scope :posted_in_forum, lambda {|forum|
{ :joins => "JOIN replies r ON r.user_id = users.id "+
"JOIN comments c ON c.user_id = users.id OR c.id = r.comment_id " +
"JOIN topics t ON t.user_id = users.id OR t.id = c.topic_id " +
"JOIN forums f ON t.forum_id = forums.id ",
:conditions => ["f.id = ?", forum],
:group => "users.id"
}
}
end
Assuming I got that right, this statement:
User.posted_in_forum(@forum)
will return a list of users that have posted in forum either by topic, comment or reply.
P.S. it's probably not a good idea to allow destruction of users in this model. The way you've laid things out, if a user is destroyed, any topics, replies or comments they posted will also be removed. Instead your users should be deactivated.