2012-09-21 57 views
0

我有一個用戶模型和一個項目模型。我想根據他們擁有的物品的價值對用戶進行排名。我想要做相當於這個查詢:我將如何使用Arel執行此查詢?

SELECT rank() OVER (ORDER BY grand_total DESC), u.*, grand_total 
FROM users AS u 
JOIN 
(SELECT user_id, SUM(amount) AS grand_total FROM items WHERE EXTRACT(YEAR FROM sold_at)='2012' GROUP BY user_id) AS i 
ON u.id = i.user_id; 

具體來說,我不知道如何加入我的選擇。

回答

1

鑑於這個問題,你形容的話,我會寫這樣的查詢:

select users.*, sum(items.amount) as rank 
    from users 
    join items on items.user_id = users.id 
    group by users.id 
    order by rank desc; 

這將轉化爲AREL爲:

User.select('users.*, sum(items.amount) as rank').joins('join items on items.user_id = users.id').group('users.id').order('rank desc') 

這有方便的副作用,你可以請在生成的User對象上調用.rank,並從查詢中獲取rank列的值,以防需要顯示它。

有什麼關於你的情況我不是在這裏抓,還是這個工作?

+0

我需要數字排名和總數來達到我的目的,所以我不能像你所做的那樣將它們合併到一個列中。另外,我意識到我離開了必須將其限制在某一年的部分,我在回答後添加了這一部分。 但是,我真的很感謝你的回答,我得到了一些關於我如何正確完成我的arel連接子句的很好的信息。 – phaedryx

+0

以下是我的解決方案:https://gist.github.com/3768744 – phaedryx