我如何使用Arel进行此查询?

时间:2012-09-21 17:28:54

标签: ruby-on-rails ruby ruby-on-rails-3 arel

我有一个User模型和一个Item模型。我想根据用户的价值对用户进行排名。我想做相当于这个查询:

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 个答案:

答案 0 :(得分: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列的值,以防您需要显示它。

你有什么关于你的情况我不在这里,或者这会有用吗?