我有一个Article
和Comment
MVC - 与标准关系。
我想根据Article
created_at
按顺序对文章进行排序,如果Article
有Comments
,则按Comments
{排序{1}}。
到目前为止,我有:
created_at
我需要添加什么才能订购@articles = Article.includes(:comments).order("comments.created_at desc")
Article
,但前提是created_at
没有评论?
答案 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
comments
按article_id
Article
在temp
上留下了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
订购