在Rails 3中组合顺序与关联

时间:2012-03-22 20:19:47

标签: ruby-on-rails ruby activerecord pagination

我有两个模型,发布和评论。帖子有很多评论和评论属于帖子。

我正在尝试做的是获得按创建日期排序的帖子列表,除非它有评论。然后需要获取最新评论的创建日期。

现在我知道我可以包含这样的协会:

Post.find(:all, :include => [:comments], :order => "comments.created_at DESC, posts.created_at DESC")

但是这将首先订阅所有帖子,然后是没有评论的帖子。我不希望任何一个单独订购,而是合并。

该解决方案还需要与pa_ate gem一样兼容,如will_paginate。

修改

我现在使用以下代码:

posts_controller.rb

@posts = Post.order('updated_at DESC').page(params[:page]).per_page(10)
comments_controller.rb

@post = Post.find(params[:post_id])
@post.update_attributes!(:updated_at => Time.now)

2 个答案:

答案 0 :(得分:2)

我建议:
将last_commented_at日期字段添加到Post模型。每当有人评论帖子更新该字段时。它会对您的数据库结构进行一些规范化,但您的查询会更快,更直接。

答案 1 :(得分:1)

<强>的Postgres

Post.paginate(:include => [:comments],
  :order => "COALESCE(comments.created_at, posts.created_at)",
  :page => 1, :per_page => 10)

<强>的MySQL

Post.paginate(:include => [:comments], 
  :order => "IFNULL(comments.created_at, posts.created_at)", 
  :page => 1, :per_page => 10)