【问题标题】:Rails: Omit order by clause when using ActiveRecord .first query?Rails:使用 ActiveRecord .first 查询时省略 order by 子句?
【发布时间】: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


    【解决方案1】:

    你会想要使用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
    

    提交消息here 表明这是对旧的first 行为的替代。

    【讨论】:

    • 完美运行。感谢您的回复。
    猜你喜欢
    • 1970-01-01
    • 2014-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-24
    相关资源
    最近更新 更多