2013-02-07 67 views
4

我剛剛將我的應用程序從MySQL過渡到Postgres。以前,.all的請求以id順序返回了所有行。在Postgres上,這些行是不按順序返回的。同樣,帶Postgres數據的Rails無序返回

Person.first 

用於返回ID爲1的記錄,現在它有時會返回另一條記錄。

如果我添加訂單條款是這樣的:

Person.order("id").first 

查詢成功,返回的第一行。這是預期的行爲?

+0

「讓我感覺很骯髒」,有一個已知的順序(從您的應用程序中刪除一個錯誤)vs隨機排序(並保持錯誤)??? –

+0

默認情況下,MySQL通過id命令。這是一個明智的假設。 – superluminary

+0

我認爲它是InnoDB,它通過主鍵命令作爲其實現的副作用。其他存儲引擎的行爲有所不同,我不確定甲骨文會否保證未來訂購保持不變。除非明確要求結果集排序,否則SQL標準非常明確。 –

回答

4

this post回答你的問題:

我不認爲通過ID排序默認情況下保證的,因爲我相信這是給非有序查詢如何被返回的數據庫。你可以把它可以通過在模型的頂部像這樣定義了默認的範圍,以便下令:

default_scope order('id ASC') 

然後調用Model.all將相當於調用Model.order(「ID ASC」)。

+1

默認範圍將稍後在查詢鏈中覆蓋其他範圍。這不是我的首選解決方案。 – superluminary

+0

另一種方法是創建一個範圍,這樣你就可以使用Person.by_id.first – blamattina

+0

我想那就是那麼走了。謝謝 – superluminary