3

私は3つのクラスを持っています

class Post
 include Mongoid::Document
 include Mongoid::Timestamps
 belongs_to :user, :inverse_of => nil
 embeds_many :comments, :as => :commentable
 field :content, :type => String
end

class Commment
  include Mongoid::Document
  include Mongoid::Timestamps
  belongs_to :user, :inverse_of => nil
  embedded_in :commentable, :polymoriphic => true
end

class User
  has_many :posts, :dependent => :destroy
  field :name, :type => String
end

ユーザーが新しいコメントを作成するたびに、その内容をユーザーが作成した最新のコメントと比較したいと考えています。ユーザーによる最新のコメントを取得するコードは次のとおりです。

comments_user=[]
Post.where("comments.user_id" => user.id).
     only(:comments).
     each {|p| comments_user += p.comments.where(:user_id => user.id).to_a}
latest_comment = comments_user.sort_by{|comment| comment[:updated_at]}.reverse.first 

上記のコードで結果が得られますが、最新のコメントを見つけるためにユーザーがコメントしたすべての投稿をトラバースする必要があるため、採用されたアプローチは効率的ではありません。もしあれば、誰でもこの問題に対するより効率的な解決策を提供できますか? 簡単に言えば、このユーザーのコメントをすべて取得する方法はありませんか?

4

2 に答える 2

5

これにより、最新のユーザーのコメントが取得されます。

Post.where("comments.user_id" => user.id).order_by(:'comments.updated_at'.desc).limit(1).only(:comments).first
于 2012-05-24T09:51:01.973 に答える
3

これは埋め込みの標準的な問題です。一部のクエリは大幅に改善されますが (「すべてのコメントを含む投稿を読み込む」)、他のクエリは非効率的/非実用的になります (「ユーザーの最新のコメントを検索する」)。

ここに 2 つのオプションがあります。

  • データの埋め込みと複製を続けます。つまり、ユーザーがコメントを作成すると、このコメントが投稿ドキュメントとユーザー ドキュメントに埋め込まれます。もちろん、このデータの重複には欠点があります (コメントを編集する必要がある場合はどうすればよいでしょうか?)。

  • 埋め込みをやめて、参照を開始します。これは、コメントが最上位エンティティになったことを意味します。結合がないため、コメント付きの投稿をすばやく読み込むことはできません。しかし、他のクエリは高速になり、データの重複はなくなりました。

于 2012-05-24T09:41:17.443 に答える