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

探しているのは、フォーラム モデルの名前付きスコープです。

Forum モデルの Comment および Reply モデルに 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 に答える