如何按 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')
我有文章
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 循环
您可以调用 #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')