按子属性排序

时间:2012-01-29 03:38:28

标签: ruby-on-rails ruby-on-rails-3 activerecord

我的Rails 3.1.2 app具有如下所示的层次关系:Categories - >讨论 - >评论

一个类别有很多讨论,讨论有很多评论。

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

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

但是,我宁愿按照与大多数论坛一样的最新评论时间来讨论讨论,最近更新的讨论出现在屏幕顶部。这样做的最佳方式是什么?

2 个答案:

答案 0 :(得分:2)

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

现在,您可以使用Discussion.all.sort_by(&:latest_comment_time)订购讨论。

答案 1 :(得分:0)

我可能会确保在发布评论时,应该将讨论的updated_at列设置为当前时间戳。如果您自己编写了所有代码,则可以使用touch选项轻松完成关联。像这样举例如:

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

  ...
end

通过这种方式,您可以继续对updated_at属性进行排序,而无需加入其他表或在其他ruby代码中执行此操作。这样做可能要快得多。

如果您使用gem或其他东西作为您的可评论函数,那么我无法确定应该如何配置它,但它应该有一些配置选项。