rails 3.1数据库查询

时间:2011-11-13 14:31:36

标签: ruby-on-rails database

我有一个带有以下型号的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列。

2 个答案:

答案 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