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

这是嵌入的标准问题。它极大地改进了一些查询(“加载包含所有评论的帖子”),但使其他查询效率低/不切实际(“查找用户的最新评论”)。

我在这里看到两个选项:

  • 继续嵌入和复制数据。也就是说,当用户发表评论时,将此评论嵌入到帖子文档和用户文档中。当然,这种数据重复有其缺点(如果您需要编辑评论怎么办?);

  • 停止嵌入并开始引用。这意味着评论现在是顶级实体。您无法快速加载带有评论的帖子,因为没有连接。但是现在其他查询速度更快,并且没有数据重复。

于 2012-05-24T09:41:17.443 回答