我有一个带有以下型号的rails 3.1应用程序:
class Post < ActiveRecord::Base
has_many :comments
end
class Comment < ActiveRecord::Base
belongs_to :post
end
我想检索5篇帖子,并附上最新评论。
问题在于,例如,帖子A有3条评论比最近关于帖子B的评论更新。
我希望查询执行以下操作:
评论中的数字表示1 =最新10 =最旧。
Post A
comment 1 #=>ok fetch the post
Post B
comment 2 #=>ok fetch the post
comment 3 #=>this post is fecthed go on find the next one
comment 4 #=>this post is fecthed go on find the next one
Post C
comment 5 #=>ok fetch the post
comment 6 #=>this post is fecthed go on find the next one
Post D
comment 7 #=>ok fetch the post
comment 8 #=>this post is fecthed go on find the next one
Post E
comment 9 #=>ok fetch the post
comment 10
是否可以进行优雅的查询来执行此操作?
一种可能的解决方案是更新post表中的:comment_updated_at列。
答案 0 :(得分:3)
这应该有效:
comments = Comment.order("updated_at DESC").group(:post_id).limit(5)
这将返回5条最后的评论,并附有不同的帖子。
所以在那之后你可以:
recent_commented_posts = comments.map(&:post)
瞧。
答案 1 :(得分:0)
如果您的Comment模型是Rails模型,它应该已经有一个updated_at列。
Comment.order(:by => :updated_at).limit(5)
但问题在于你只收到5条最新的评论 - 这些评论不一定在5个不同的帖子中。
另一方面,您可以找到包含5个最新更新评论的5个独特帖子,如下所示:
comments = Comment.order(:by => :updated_at).select("DISTINCT(post_id)").limit(5)
但这并未显示这5篇帖子的所有评论。
最好先做第二个查询,通过post_id到达帖子,然后列出每个帖子的相关评论。
这些内容:(当然,你需要在视图中执行此操作,不使用'puts')
comments.each do |c|
puts c.post.name
puts c.post.comments.order(:by => :updated_at) # instead of just showing one comment 'c'
end