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

How do I sort an array by a child attribute in Rails?

我有文章

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

我需要向用户显示可用文章列表,但按评论的时间戳排序。就像一个图像板,当您 post 某线程上的某些内容时,该线程会 "bumped" 到顶部。

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

-编辑- 使用组 .group('articles.title') 实际上有效。但我发现 joins 不包括还没有评论的文章。我将其切换为 includes 并且显然有效。但是现在我遇到了一个问题,没有任何评论的 posts 最终出现在列表的底部,而我需要它们在顶部。一个解决方案是在创建文章时创建一个空评论,但我也不知道该怎么做 -EDIT2- 我解决了它。我这样做是为了与 post 一起创建一个自动评论,所以每个 post 都有一个带有时间戳的评论来比较。我只是将这一行 @comment = @article.comments.create(body: '~start~') 放在 @article.save 循环

内的 articles_controller.rb 上

您可以调用 #distinct 查询:http://apidock.com/rails/ActiveRecord/QueryMethods/distinct

您可以使用分组依据

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

这个怎么样?

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