【发布时间】:2016-10-18 17:46:14
【问题描述】:
我在 Rails 4 ActiveRecord 中遇到 .first 查询问题。 Rails 4 中的新行为是在 id 字段中添加 order by,以便所有 db 系统输出相同的 order。
所以这个...
Foo.where(bar: baz).first
将给出查询...
select foos.* from foos order by foos.id asc limit 1
我遇到的问题是我的选择包含两个总和字段。在查询中自动抛出 order by id 时,我收到一个错误,即 id 字段必须出现在 group by 子句中。错误是对的,如果我希望输出是这两个字段的总和,则不需要 id 字段。
这是一个不起作用的例子......
baz = Foo.find(77).fooviews.select("sum(number_of_foos) as total_number_of_foos, sum(number_of_bars) as total_number_of_bars").reorder('').first
这是错误...
ActiveRecord::StatementInvalid: PG::GroupingError: ERROR: column "foos.id" 必须出现在 GROUP BY 子句中或在聚合函数中使用 第 1 行:...bars FROM "fooviews" ORDER BY "...
由于 select 是一个聚合表达式,因此不需要 order by id,但 AR 会自动将其放入。
我发现我可以在 .first 之前的末尾添加 reorder('') 并删除 order by id,但这是正确的有什么办法解决这个问题?
谢谢
[更新] 我没有提到的是,我正在将一个大型 Rails 3 项目转换为 Rails 4。所以 Rails 3 的输出是一个 AR 对象。如果可能,我希望解决方案保持该格式,以便在转换中更改的代码更少。
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-4 activerecord rails-activerecord