在数据库中订购用户,所以每次查询时都不必执行order_by

时间:2012-07-05 00:55:16

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

我可以在数据库中订购用户,所以每次查询时都不必说order_by(“created_at desc”)吗?

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

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

3 个答案:

答案 0 :(得分:2)

如果您在按创建日期desc 排序的结果之后,reverse natural order将接近此(但不保证相同)。

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

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

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

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

答案 1 :(得分:1)

有关于默认范围的混合观点,但要实现您的要求:

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

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

答案 2 :(得分:0)

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

编辑:应该扩大。

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

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