【问题标题】:Is there a guarantee that ActiveRecord returns objects ordered by ID?是否保证 ActiveRecord 返回按 ID 排序的对象?
【发布时间】:2014-12-06 14:34:47
【问题描述】:

我的项目托管在 Heroku 上。 当Room.all 方法返回带有first object with ID 2 的对象时,我感到很惊讶,然后才返回second object with ID 1。我认为有某种保证返回的对象已经按 ID 排序。我应该总是调用Room.all.order(:id) 而不是常规的all 方法吗?

irb(main):002:0> Room.all
=> #<ActiveRecord::Relation [
    #<Room id: 2, color: "rgb(83, 180, 83)", status: "Status #2", created_at: "2014-10-11 14:14:02", updated_at: "2014-10-11 14:18:19">, 
    #<Room id: 1, color: "rgb(0, 96, 255)", status: "Status #3", created_at: "2014-10-11 14:14:02", updated_at: "2014-10-11 14:18:30">
  ]>

【问题讨论】:

  • No 不能确定订单。我一直在使用 Oracle,PostgreSQL,它没有提供有序的记录。 MySQL 似乎按顺序返回记录。

标签: ruby-on-rails postgresql activerecord ruby-on-rails-4 heroku


【解决方案1】:

不。 Room.all 只是以 SQL SELECT * FROM rooms; 结尾 - 没有订单。在这种情况下,记录的顺序由数据库决定(例如,在 PostgreSQL 中,我注意到它最后返回最近更新的记录)。

如果您想确保在调用.all 时有订单,请添加一个添加它的默认范围:

default_scope order('rooms.id ASC')

【讨论】:

  • 当心 default_scope。一旦应用了排序的 default_scope,就不能直接应用其他排序,除非你使用reorder。此外,它生成查询的方式因数据库而异。
猜你喜欢
  • 2013-05-28
  • 2012-06-20
  • 2013-01-19
  • 2010-11-18
  • 2011-02-24
  • 2012-06-18
  • 1970-01-01
相关资源
最近更新 更多