1

我的項目託管在Heroku上。 當Room.all方法返回對象first object with ID 2,然後只有一個second object with ID 1時,我很驚訝。我認爲有一些保證,返回的對象已經按ID排序。我是否應該始終撥打Room.all.order(:id)而不是常規的all方法?有沒有保證ActiveRecord返回按ID排序的對象?

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"> 
    ]> 
+1

無,取決於DB」 – apneadiving 2014-10-11 15:44:25

+1

沒有不能確定有關訂單。我一直在使用Oracle,PostgreSQL,它沒有提供有序的記錄。 MySQL似乎依次返回記錄。 – Allerin 2014-10-11 16:02:02

回答

3

沒有。 Room.all只是以SQL SELECT * FROM rooms;結尾 - 沒有訂單。在這個事件中,記錄的順序是由數據庫決定的(例如,在PostgreSQL中,我注意到它最後返回了最近更新的記錄)。

如果你想確保有一個順序,當你調用.all,添加默認範圍這增加了它:

default_scope order('rooms.id ASC') 
+0

請注意default_scope。一旦應用了排序的default_scope,除非使用'reorder',否則不能直接應用其他排序。它也因數據庫的不同而產生查詢。 – Allerin 2014-10-11 16:05:20

相關問題