Rails 4:按关联的created_at排序(如果存在),否则按父级排序

时间:2016-02-26 04:56:29

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

我有一个ArticleComment MVC - 与标准关系。

我想根据Article created_at按顺序对文章进行排序,如果ArticleComments,则按Comments {排序{1}}。

到目前为止,我有:

created_at

我需要添加什么才能订购@articles = Article.includes(:comments).order("comments.created_at desc") Article,但前提是created_at没有评论?

3 个答案:

答案 0 :(得分:1)

您可以使用coalesce

@articles = Article.includes(:comments)
                   .order('coalesce(comments.created_at, articles.created_at) desc')
                   .references(:comments)

答案 1 :(得分:0)

选择两个不同的对象,一个有评论,另一个没有。

@articles_one = Article.includes(:comments).where('comments.id IS NOT NULL').order("comments.created_at desc")

@articles_two = Article.includes(:comments).where('comments.id IS NULL').order("articles.created_at desc")

然后,添加两个对象以获得最终所需结果。

@articles_final = @articles_one + @articles_two

答案 2 :(得分:0)

您可以通过以下单个查询来实现:

@articles = Article.joins("LEFT OUTER JOIN ( SELECT article_id, MAX(created_at) AS max_created_at
                                             FROM comments
                                             GROUP BY article_id
                                           ) AS temp
                           ON temp.article_id = articles.id
                          ").order("CASE WHEN temp.max_created_at IS NULL THEN 1 ELSE 2 END, articles.created_at")

<强>解释

  • 子查询temp commentsarticle_id
  • 分组
  • Articletemp上留下了article_id的外部联接,这意味着:article没有任何comment,将{{1} }} = max_created_at
  • 我们按NULL订购,这意味着文章的评论将由CASE WHEN temp.max_created_at IS NULL THEN 2 ELSE 1 END订购,然后文章没有任何评论将由max_created_at订购