我在我的一个页面上运行了一个查询。它基本上遍历transactions表,加入每个事务的付款(多对一关联),计算事务上的“余额”字段(使用select),按此排序并返回前10名。
它是这样的:
@high_balance_transactions = Transaction.
joins(:payments).
select(["transactions.*", "SUM(...) as balance"]).
group(:id).
having("balance < 0").
order(:balance).
limit(10)然后,在我看来,我将这些数据放在一个表中,并且需要来自支付本身的数据,所以我最终得到了很多查询( "N+1“问题...)。
我试图将.includes(:payments)添加到查询中,但得到了这个错误:
ActiveRecord::StatementInvalid: Mysql2::Error: Unknown column 'balance' in 'order clause'我在错误后面的SQL中看到,ActiveRecord没有将我的计算字段添加到它所做的查询中,但它只是在我添加includes部件时才删除了它。这有什么原因吗?
如何才能既使用计算字段(用于订单和拥有),又仅包括符合所有条件的记录的付款数据?
谢谢!
发布于 2013-04-04 17:08:00
当使用includes时,select被Rails忽略,这就是为什么你会得到错误(我在几个SO问题中发现了这一点,但我不知道这种行为背后的原因)。
我认为如果您在having和order子句中移动SUM(...)就可以解决您的问题
balance = 'SUM(...)'
@high_balance_transactions = Transaction.
joins(:payments).
includes(:payments).
group('payments.id').
having("#{balance} < 0").
order(balance).
limit(10)这在SQL请求中不是很好,但它肯定不会影响性能,BD只会计算一次。
https://stackoverflow.com/questions/15806475
复制相似问题