dsm*_*rey 1 activerecord ruby-on-rails ruby-on-rails-4 rails-activerecord
我在Rails 4 ActiveRecord中的.first查询有问题。Rails 4中的新行为是通过 id字段添加顺序,以便所有数据库系统都将输出相同的顺序。
所以这...
Foo.where(bar: baz).first
Run Code Online (Sandbox Code Playgroud)
将给出查询...
select foos.* from foos order by foos.id asc limit 1
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是我的选择包含两个求和字段。随着通过ID顺序查询自动抛出,我收到的ID字段必须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
Run Code Online (Sandbox Code Playgroud)
这是错误...
ActiveRecord :: StatementInvalid:PG :: GroupingError:错误:“ foos.id”列必须出现在GROUP BY子句中或在聚合函数中使用LINE 1:... bars from“ fooviews” ORDER BY“ ...
由于select是一个聚合表达式,因此不需要id的顺序,但是AR会自动将其放入。
我发现我可以在.first之前在末尾添加reorder('')并通过id删除订单,但这是解决此问题的正确方法吗?
谢谢
[更新] 我忽略提到的是我正在将一个大型的Rails 3项目转换为Rails4。因此,Rails 3的输出是一个AR对象。如果可能,我希望解决方案保持该格式,以便在转换中更改的代码更少。
您将要使用take:
该
take方法检索记录而没有任何隐式顺序。
例如:
baz = Foo.find(77).fooviews.select("sum(number_of_foos) as total_number_of_foos, sum(number_of_bars) as total_number_of_bars").take
Run Code Online (Sandbox Code Playgroud)
此处的提交消息表示这是旧first行为的替代。
| 归档时间: |
|
| 查看次数: |
624 次 |
| 最近记录: |