【问题标题】:Rails order not working with onlyRails 订单仅适用于
【发布时间】:2013-04-04 04:07:07
【问题描述】:

我无法在任何地方找到此文档,但这是我的问题:当我通过活动记录查询并使用“only”时,“order”子句被忽略。例如我有一个博客模型:

Blog.order('id desc')

首先返回所有具有最高 ID 的博客 - 正如预期的那样:

Blog.order('id desc').only(:id)

仅返回 id(如预期)但 order 子句被完全忽略,最小的 id 优先。

我已经使用 Ruby 1.9.3p327 以及 Rails 4.0.0.beta1 和 Rails 3.2.13 对此进行了测试,得到了相同的结果。

这是功能还是错误?对我来说这是一个错误,因为 Rails 工作人员大肆宣扬 find_by_sql 并不是真正需要的,但在这种情况下它是:

Blog.find_by_sql("select id from blogs order by id desc")

给出正确答案。

【问题讨论】:

    标签: ruby-on-rails rails-activerecord


    【解决方案1】:

    尝试使用pluck 而不是onlyonly 用于覆盖先前形成的查询链的部分。正如the docs 所展示的那样:

    Post.where('id > 10').limit(20).order('id desc').only(:order, :where)
    

    结果:

    SELECT * FROM posts WHERE id > 10 ORDER BY id DESC
    

    这是因为limit 修改将被忽略,因为传递给only 的列表不包括:limit

    更新

    如果您需要返回实际模型对象而不是 id 数组,请使用 select

    Blog.order('id desc').select('id')
    

    【讨论】:

    • 是的。你是对的。来自 pluck 的记录不适用于路线 - 尽管我从未问过。我会在下一次发布之前 RTFM。非常感谢。
    • 然后使用select 而不是pluck - 它将返回一个仅填充了这些字段的对象。更新了答案。
    • 是的,我已经选择了整个代码库 - 那么为什么今晚我不使用它,甚至不记得使用它呢?早晚。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-13
    • 1970-01-01
    • 2016-09-02
    • 2016-07-02
    相关资源
    最近更新 更多