2013-09-16 59 views
2

Model.first不從表格中檢索第一條記錄。相反,它會查找表中的任何隨機記錄。Model.first不從表格檢索第一條記錄

eg: 
    Merchant.first 
    Query 
    SELECT "merchants".* FROM "merchants" LIMIT 1 
    => <Merchant id: 6, merchant_name: "Bestylish", description: "", description_html: "" > 


Instead the query should be 
    SELECT "merchants".* FROM "merchants" ORDER BY "merchants"."id" ASC LIMIT 1; 


Why it doesnot retrive the first record 

回答

2

這似乎是與Postgres的默認行爲,如一些積極的記錄版本不默認排序添加到查詢第一,同時增加了一個最後。

https://github.com/rails/rails/issues/9885

PostgreSQL沒有默認應用排序,這通常是性能一件好事。

所以在這種情況下,「第一」意味着「返回的第一行」,而不是「當按某個無意義的鍵值排序時的第一行」。

奇怪的是,「最後」似乎是按ID排序的。

+0

Model.last它通過導軌中的id desc命令。 –

+1

現在在Rails 4.這個問題也解決了。 Model.first將以id asc命令。 –

+0

是的 - 但第一行爲依賴於RDBMS。它很奇怪,因爲它不一致。如果Rails對最後一個含義是「主鍵值最高的那個」,那麼它也可以爲「first」指定一個行爲,而不是將其留給數據庫。 –

3

Model.first將使用數據庫的默認排序。例如, 。在Postgresql中,默認排序不一定是一個id。

+2

實際上在PostgreSQL中根本沒有默認排序,謝天謝地。無論如何,整個事情依賴於主動記錄版本。 –

0

您需要自行應用排序。嘗試撥打電話Merchant.order('id ASC').first 使用模型中的默認範圍可能會自動執行此操作,但我不確定這一點。

1

在Rails 4中定義了here,如果沒有指定其他順序條件,則通過主鍵進行排序。

在Rails 3.2.11,它是這樣的:

def find_first 
    if loaded? 
    @records.first 
    else 
    @first ||= limit(1).to_a[0] 
    end 
end 

沒有order方法,這將只適用限制,然後離開訂貨到你的數據庫。