首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ActiveRecord -在计算字段上使用order时无法使用include

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

Stack Overflow用户
提问于 2013-04-04 16:47:09
回答 1查看 102关注 0票数 0

我在我的一个页面上运行了一个查询。它基本上遍历transactions表,加入每个事务的付款(多对一关联),计算事务上的“余额”字段(使用select),按此排序并返回前10名。

它是这样的:

代码语言:javascript
复制
@high_balance_transactions = Transaction.
  joins(:payments).
  select(["transactions.*", "SUM(...) as balance"]).
  group(:id).
  having("balance < 0").
  order(:balance).
  limit(10)

然后,在我看来,我将这些数据放在一个表中,并且需要来自支付本身的数据,所以我最终得到了很多查询( "N+1“问题...)。

我试图将.includes(:payments)添加到查询中,但得到了这个错误:

代码语言:javascript
复制
ActiveRecord::StatementInvalid: Mysql2::Error: Unknown column 'balance' in 'order clause'

我在错误后面的SQL中看到,ActiveRecord没有将我的计算字段添加到它所做的查询中,但它只是在我添加includes部件时才删除了它。这有什么原因吗?

如何才能既使用计算字段(用于订单和拥有),又仅包括符合所有条件的记录的付款数据?

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-04 17:08:00

当使用includes时,select被Rails忽略,这就是为什么你会得到错误(我在几个SO问题中发现了这一点,但我不知道这种行为背后的原因)。

我认为如果您在having和order子句中移动SUM(...)就可以解决您的问题

代码语言:javascript
复制
balance = 'SUM(...)'
@high_balance_transactions = Transaction.
  joins(:payments).
  includes(:payments).
  group('payments.id').
  having("#{balance} < 0").
  order(balance).
  limit(10)

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15806475

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档