2014-01-28 181 views
0

如果我有以下关系:获取用户的帖子最近的帖子评论最多下令

User 
has_many :posts 

Post 
has_many :comments 
belongs_to :user 

Comment 
belongs_to :post 

如何获得用户的帖子将每个帖子最近的评论有序?我正在使用Rails和Postgres。理想情况下,我想用连接来做到这一点。

回答

1

从长远来看,您可能会发现在创建评论时更新了Post对象的updated_at会更容易和更高效。如果你不喜欢这个想法,你可以添加一个comment_added_at属性,并改为更新。

这是很容易实现与对孩子的关联:touch选项:

Comment 
belongs_to :post, :touch => true # This will update the Post.updated_at attribute 
belongs_to :post, :touch => :comment_added_at # This updates the specified attribute instead 

然后,你可以简单地为了通过:updated_at:comment_added_at和保存递归查询数据库。

如果你真的想与联接,试试这个做到这一点:

User.find(1).posts.joins(:comments).order('comments.created_at desc').group(:id) 
+0

我喜欢comment_added_at方法。使用updated_at将无法正常工作,因为编辑的帖子会在最近发表评论时显示。感谢您的回复。 – ckarbass

+0

值得注意的是':touch'方法也会在编辑/删除注释之后更新帖子。如果这是不可取的,你可以使用after_create回调来更新父代。 – Jon

+0

我的设想很有意思,对我来说这不是问题,但值得为其他人指出。我仍然有兴趣了解如何通过连接来完成此操作。暂时搁置接受一个答案。 – ckarbass

0

我有这个在我的应用程序已经通过它在我的主页上列出的最新职位排序。也许它会帮助你设置帖子最近评论的顺序。

@posts = Post.select([:ID,:标题])。为了( “created_at DESC”)的限制(6)

您可能需要做一些喜欢以下,但不知道这是否将非常适合你。

@posts = post.comments.select。([:ID,:标题])顺序( “created_at DESC”)的限制(6)

0

可以使用下面的代码作为参考:

User.includes(:comments).where("posts.user_id =? ", post_owner_user_id).order("comments.created_at desc") 

我希望它会给你想要的结果。

相关问题