Ruby on rails 按子属性排序

Ruby on rails 按子属性排序,ruby-on-rails,ruby-on-rails-3,activerecord,Ruby On Rails,Ruby On Rails 3,Activerecord,我有一个Rails 3.1.2应用程序,它的层次关系如下:类别->讨论->评论 一个类别有许多讨论,一个讨论有许多评论 在categories show视图中,我显示了属于该类别的所有讨论的列表。我用Kaminari进行分页。到目前为止,我已经设法在创建讨论时订购了它们,如下所示: @discussions=Discussion.where(:category_id=>@category.id).order('created_at desc').page(params[:page]) 然而,我宁

我有一个Rails 3.1.2应用程序,它的层次关系如下:类别->讨论->评论

一个类别有许多讨论,一个讨论有许多评论

在categories show视图中,我显示了属于该类别的所有讨论的列表。我用Kaminari进行分页。到目前为止,我已经设法在创建讨论时订购了它们,如下所示:

@discussions=Discussion.where(:category_id=>@category.id).order('created_at desc').page(params[:page])

然而,我宁愿在讨论的最新评论出现之前就开始讨论,就像大多数论坛一样,最新更新的讨论出现在屏幕顶部。最好的方法是什么?

类别class Category < Model
  has_many :discussions, :dependent => :destroy
  has_many :comments, :through => :discussions, :dependent => :destroy

  def latest_comment_time
    comments.last.created_at
  end
end
有很多:讨论,:依赖=>:销毁 有很多:评论,:通过=>:讨论,:依赖=>:销毁 def最新评论时间 comments.last.created_位于 结束 结束
现在,您可以使用
Discussion.all.sort\u by(&:latest\u comment\u time)
对讨论进行排序,我可能会确保在发布评论时,它应该将讨论的
updated\u at
列设置为当前时间戳。如果您自己编写了所有代码,那么使用
touch
关联选项应该可以轻松完成。例如:

class Comment < ActiveRecord::Base
  belongs_to :commentable, :polymorphic => true, :touch => true

  ...
end
class注释true,:触摸=>true
...
结束
这样,您就可以继续对更新的_at属性上的讨论进行排序,而无需连接其他表或在其他ruby代码中进行排序。这样做可能要快得多


如果您使用gem或其他东西作为可注释功能,那么我不能确定该如何配置,但它应该有一些配置选项。

这不起作用。我应该补充一点,讨论和评论之间存在多态性关联(讨论是可评论的),尽管我不确定这是否重要。你提到的代码
@forum.comments.last
似乎是在获取评论,而我想获取讨论,但按照每次讨论中创建的最后一条评论进行排序。我拿出分散注意力的糠秕,只专注于我试图解释的内容。如何获取讨论?我尝试了
@discussions=Discussion.order('latest_comment.created_at')
,但它抛出了一个
SQLite3::SQLException:没有这样的列
错误。尝试将
def latest_comment
更改为
def latest_comment\u time;comments.last.created_at;结束
。然后你可以进行
讨论.all.sort by(&:latest\u comment\u time)
:touch
的问题是,它在保存评论时也会触发。想象一下一个论坛,如果你只需编辑一个主题中的任何帖子就可以撞到一个主题。如果这确实是一个不想要的结果,那将是一个问题。我仍然认为这是最有效的方法,如果触摸应该是有条件的,那么它也可以在创建回调或其他解决方案后移动到
。我通常支持在数据库级别上执行所有类型的排序,而不是将其留给控制器。