1

首先是数据模型:

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

因此用户可以将主题发布到论坛。他们还可以在论坛中发布对主题的评论。他们可以发布对评论的回复。

我希望能够通过发布主题或评论或回复来获得他们参与的论坛列表。

4

1 回答 1

0

您正在寻找的是论坛模型中的命名范围

通过在论坛模型中为您的评论和回复模型添加 has_many :through 关系,可以大大简化连接。但我永远不记得嵌套连接是如何工作的,所以我发布了一个可以与你所拥有的东西一起工作的解决方案。

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

现在...

Forum.user_posted(@user)

将返回用户发布主题、回复或评论的论坛数组。

对于特定用户发布的论坛列表:

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

假设我是对的,这个声明:

User.posted_in_forum(@forum)

将按主题、评论或回复返回在论坛中发帖的用户列表。

PS 在这个模型中允许破坏用户可能不是一个好主意。按照您的布局方式,如果用户被销毁,他们发布的任何主题、回复或评论也将被删除。相反,您的用户应该被停用。

于 2010-02-02T20:51:17.653 回答