【问题标题】:Order users in database, so I don't have to do order_by each time I query对数据库中的用户进行排序,所以我不必每次查询时都执行 order_by
【发布时间】:2012-07-05 00:55:16
【问题描述】:

我可以在数据库中对我的用户进行排序,这样我每次查询时都不必说 order_by("created_at desc") 吗?

听起来对我来说是一件合乎逻辑的事情,但我不知道这是否可行以及是否是最佳做法?

解决方案

我已经在使用 default_scope,据我所知,这是最好的方法吗?非常感谢您的回答。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 mongodb mongoid


    【解决方案1】:

    如果您希望得到按创建日期描述排序的结果,reverse natural order 将接近此值(但不能保证完全相同)。

    如果您需要特定的排序,将order_by() 添加到索引查询是确保这一点的最佳方式。

    如果您使用默认生成的ObjectIds,前 4 个字节实际上是一个 unix 时间戳(自纪元以来的秒数).. 并且 _id 字段是 indexed by default,除了文档中提到的一些例外情况.

    因此,在 mongo shell 中创建的最近 50 个用户(基于 ObjectId)的查询将是:

    db.users.find().sort({_id:-1}).limit(50)
    

    【讨论】:

      【解决方案2】:

      对于默认范围有不同的看法,但要实现您的要求:

      http://apidock.com/rails/ActiveRecord/Base/default_scope/class

      class User < ActiveRecord::Base
        default_scope order('created_at DESC')
        ### other model code here ###
      end
      

      【讨论】:

      • 关闭,但它是order,而不是order_by
      【解决方案3】:

      您应该能够为您的数据库表添加一个或多个索引。在实时系统上运行时要小心,因为在大表上创建索引的开销可能会被禁用。

      编辑:应该已经扩展了。

      通过创建索引,您仍然需要排序,但您的排序/排序会更有效率。

      参考:Is it okay to add database indexes to a database that already has data?

      【讨论】:

        猜你喜欢
        • 2021-08-19
        • 1970-01-01
        • 1970-01-01
        • 2018-05-10
        • 1970-01-01
        • 2012-02-25
        • 2014-11-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多