2012-03-08 46 views
2

我知道这听起来像是“为我做功课”的问题,但我一直在努力用ActiveRecord重新创建此查询一段时间,现在想知道是否可以做此无需求助于使用ActiveRecord::Base.connection.execute如何在ActiveRecord中重新创建此查询

结构基本上:

Member has_many orders and transactions

我需要显示所有谁了订单,从订单的总量的成员,和交易的一个数给定的日期范围按总量排序。

我能得到我需要用下面的查询数据:

SELECT members.*, 
SUM(orders.amount) AS total_amount, 
COUNT(transactions.id) AS total_transactions 
FROM members 
INNER JOIN orders ON (orders.member_id = member.id) 
LEFT JOIN transactions ON (transactions.member_id = members.id) 
WHERE orders.created_at BETWEEN "2012-03-01" AND "2012-04-01" 
GROUP BY member.id 
ORDER BY total_amount DESC 

是否有可能制定通过的ActiveRecord此查询?

回答

2

这是我会做它通过ActiveRecord的:

Member.includes(:orders, :transactions).select("SUM(orders.amount) as total_amount").where("orders.created_at BETWEEN '2012-03-01' AND '2012-04-01'").group('members.id').order('total_amount DESC') 

这包括大量的原始SQL片段。如果你想用实际的Ruby代码替换那些,你可以通过创造性地使用Member.arel_table来实现。有关如何做到这一点的信息,请参阅the Arel documentation