2014-09-29 63 views
0

背景:按關聯排序時設置默認值

我正在使用Rails和Postgres製作Hacker News的簡單副本。我已經完成了大部分工作,而且我正在努力讓訪問者通過它的分數對網站進行排序。就目前而言,我有,主要是工作。下面是相關的代碼:

Article.select("articles.*, SUM(CASE votes.is_up WHEN FALSE THEN -1 ELSE 1 END) AS score") .joins("LEFT JOIN votes ON articles.id = votes.votable_id AND votes.votable_type = 'Article'") .group("articles.id") .order("score DESC")

正如你或許可以告訴,這有一個問題:沒有得分的文章沒有適當的排序(至少有一個問題,反正 - 我不是一個SQL親以任何方式)。例如,如果我的文章分數爲2,-1,5和0,則訂單將爲0, 5, 2, -1,而不是5, 2, 0, -1的正確訂單。

問:

我認識到,要做到這一點最簡單的/最好的辦法可能是隻是把score列上articles - 並且我很可能也是走這條路線 - 但是這已經讓我很好奇:有沒有什麼辦法可以給出默認score爲0到articles而沒有關聯votes

更新1:

基礎上提出的建議,我已經改變了我的select語句:

Article.select("articles.*, COALESCE(SUM(CASE votes.is_up WHEN FALSE THEN -1 ELSE 1 END), 0) AS score")

然而,這並沒有改變結果的。

更新2:

運行我的查詢生成的SQL:

SELECT articles.*, COALESCE(SUM(CASE votes.is_up WHEN FALSE THEN -1 ELSE 1 END), 0) AS score FROM "articles" LEFT JOIN votes ON articles.id = votes.votable_id AND votes.votable_type = 'Article' GROUP BY articles.id ORDER BY score DESC LIMIT 20 OFFSET 0

您還可以看到LIMITOFFSET,我使用的分頁 - 我沒有提到這一點原本是因爲我預計它不相關。

+0

做一個左外連接和'聚結((SUM(票),0)' – 2014-09-29 04:08:11

+0

我從來沒有碰到過'coalesce'之前,非常感謝!從看Postgres的文檔,它肯定看起來像什麼我想要。 你在哪裏建議把左連接? – aandrea 2014-09-29 05:19:38

回答

0

看起來你只是得到NULL,所以你需要一個COALESCE將它轉換爲0;

Article.select(
    "articles.*, COALESCE(SUM(CASE votes.is_up WHEN FALSE THEN -1 ELSE 1 END), 0) AS score") 
... 
+0

謝謝!使用'COALESCE'絕對看起來是正確的路要走。但是,我得到了與以前完全相同的行爲, Postgres文檔,我覺得很奇怪,任何想法? – aandrea 2014-09-29 05:22:36

+0

@aandrea聽起來很奇怪,你能不知怎麼看到生成的SQL? – 2014-09-29 08:06:38

+0

我用生成的SQL更新了主帖,再次感謝! – aandrea 2014-09-29 18:57:28