【问题标题】:Rails: Order activerecord object by attribute under has_many relationRails:在has_many关系下按属性订购activerecord对象
【发布时间】:2025-12-25 21:40:15
【问题描述】:
class Post
  has_many :commments
end

class Comment
  belongs_to :post
end

我希望显示按post 创建日期排序的posts 列表(submitted_at)。我还希望一些post xyz 出现在顶部,如果它发布了一些新评论但尚未由版主审核。我们将通过 cmets 级别的 boolean 属性/字段来确定这一点(moderated = 1/0)

我试过了

Posts.join(:comments)
  .distinct
  .order("submitted_at DESC, comments.moderated")

但这不包括没有comments 且结果未按预期排序的帖子。我确信我们可以在 ruby​​ 级别做到这一点,但正在寻找一种使用 AR 来做到这一点的方法。

【问题讨论】:

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


【解决方案1】:

对于连接,使用这个:

Posts.join("LEFT JOIN comments ON comments.post_id = posts.id")

这将包括没有 cmets 的那些。

您的排序似乎表明您需要计算受审核的 cmets,在这种情况下,请尝试以下操作:

.order("submitted_at DESC, COUNT(comments.moderated)")

不过,您可能也需要以某种方式使用group

【讨论】:

  • 我不需要计数。我只希望带有 cmets 的帖子尚未在顶部进行审核。伯爵能帮我吗?
  • 啊。主持是一个布尔字段吗?
  • 是的.. 但在 db 中,它按照 Rails 约定存储为 0/1。