我有一个查询,我在其中一个页面中运行。它基本上通过交易表,加入每笔交易的付款(多对一关联),计算交易的“余额”字段(选择),按此订单并返回前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
部分时才删除它。有什么理由吗?
如何同时使用计算字段(针对订单和拥有)并仅为通过所有条件的记录包含付款数据?
谢谢!
答案 0 :(得分:0)
使用includes
时,Rails会忽略select
,这就是您收到错误的原因(我在几个问题中发现了这个问题,但我不知道这种行为背后的原因) )。
如果您移动SUM(...)
和having
条款中的order
,我认为您可以解决问题
balance = 'SUM(...)'
@high_balance_transactions = Transaction.
joins(:payments).
includes(:payments).
group('payments.id').
having("#{balance} < 0").
order(balance).
limit(10)
在SQL请求中不是很好,但它肯定不会影响性能,BD只会计算一次。