ActiveRecord - 在计算字段上使用order时无法使用include

时间:2013-04-04 08:47:09

标签: ruby-on-rails-3 activerecord

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

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

谢谢!

1 个答案:

答案 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只会计算一次。