0

我有一个在我的一个页面中运行的查询。它基本上通过一个交易表,连接每笔交易的付款(多对一关联),计算交易的“余额”字段(使用选择),按此排序并返回前 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部分时才删除它。有什么理由吗?

如何同时使用计算字段(用于订单和拥有)并仅包含通过所有条件的记录的付款数据?

谢谢!

4

1 回答 1

0

使用时includesselectRails 会忽略 ,这就是您收到错误的原因(我在几个 SO 问题中发现了这一点,但我不知道这种行为背后的原因)。

我认为如果你SUM(...)havingandorder子句中移动你可以解决你的问题

balance = 'SUM(...)'
@high_balance_transactions = Transaction.
  joins(:payments).
  includes(:payments).
  group('payments.id').
  having("#{balance} < 0").
  order(balance).
  limit(10)

在 SQL 请求中不是很好,但肯定不会影响性能,BD 只会计算一次。

于 2013-04-04T09:08:00.303 回答