如何通过Rails中的子属性对数组进行排序?

时间:2015-10-23 06:35:47

标签: ruby-on-rails ruby sorting activerecord nested

我有文章

class Article < ActiveRecord::Base
  has_many :comments, dependent: :destroy
  validates :title, length: { minimum: 3, maximum: 100 }
  validates :text, length: { minimum: 5, maximum: 3000 }
end

我有

class Comment < ActiveRecord::Base
  belongs_to :article
  validates :body, presence: true,
                    length: { maximum: 3000 }
end

我需要向用户显示可用文章列表,但是按评论的时间戳排序。就像一个图像板,当你在一个线程上发布东西时,线程会“碰到”顶部。

我设法<% @articles.joins(:comments).order('comments.created_at desc').each do |article| %>来了。它以正确的方式排序,但它显示相同的线程乘以其上的帖子数量。例如,如果一个帖子有5个回复,则会向用户显示5个不同的时间。我该如何解决这个问题?

CNC中 使用组.group('articles.title')实际上工作。但我发现加入不包括尚无评论的文章。我将其切换为 includes ,显然它有效。但现在我遇到的问题是,没有任何评论的帖子最终会出现在列表的底部,我需要它们在顶部。一个解决方案是在创建文章时创建一个空注释,但我不知道如何做到这一点-EDIT2-我解决了它。我这样做是为了与帖子一起创建一个自动评论,所以每个帖子都有一个带有时间戳的评论来进行比较。我只是将这行@comment = @article.comments.create(body: '~start~')放在@ article.save循环

中的articles_controller.rb上

3 个答案:

答案 0 :(得分:2)

您可以使用分组

<% @articles.joins(:comments).order('comments.created_at desc').group('articles.title').each do |article| %>

答案 1 :(得分:1)

您可以在查询中致电#distincthttp://apidock.com/rails/ActiveRecord/QueryMethods/distinct

答案 2 :(得分:0)

这个怎么样?

# controller
@articles = Article.includes(:comments).order('comments.created_at desc')