2017-07-31 65 views

回答

0

這兩者是等價的。當您評估並從中獲取結果時,SQL將由ActiveRecord生成。使用.to_sql看到,被生成的SQL:

[1] pry(main)> User.offset(6).limit(5).to_sql 
=> "SELECT `users`.* FROM `users` LIMIT 5 OFFSET 6" 
[2] pry(main)> User.limit(5).offset(6).to_sql 
=> "SELECT `users`.* FROM `users` LIMIT 5 OFFSET 6" 
0

在你的問題中提到這兩種情況下生成的SQL查詢是相同的,因此它們產生相同的結果。所以基本上,在同一個模型中使用偏移和限制的順序沒有區別。

>> Model.offset(5).limit(6).pluck(:id) 
    # SELECT `model`.`id` FROM `model` LIMIT 6 OFFSET 5 
    # [6, 7, 8, 9, 10, 11] 

>> Model.limit(6).offset(5).pluck(:id) 
    # SELECT `model`.`id` FROM `model` LIMIT 6 OFFSET 5 
    # [6, 7, 8, 9, 10, 11] 
3

事情是你錯誤地認爲鏈式鋼軌方法的順序很重要。事實上,事實並非如此。除非實際執行方法被調用,所有這些方法只是改變正在準備內部查詢:

> User.limit(6).class 
#⇒ User::FriendlyIdActiveRecordRelation 
> User.offset(5).class 
#⇒ User::FriendlyIdActiveRecordRelation 

儘管如此,爲了以防無所謂,除非一個調用執行方法,像each(直接或通過如to_a,map等)或pluck的方法。

> User.limit(6).offset(5).to_sql 
#⇒ "SELECT `users`.* FROM `users` LIMIT 6 OFFSET 5" 
> User.offset(5).limit(6).to_sql 
#⇒ "SELECT `users`.* FROM `users` LIMIT 6 OFFSET 5" 
+0

'all'不會觸發查詢。 '每個'都有。 –

+0

該死的,的確,爲什麼地球上的「全部」不?在關係中調用'all'而不觸發查詢的原因是什麼? Rails吸吮。 – mudasobwa

+0

現在,這是一種獲取「空」查詢以供以後定製的方法。 'products = Product.all; products = products.where(query1)if cond1; products = products.where(query2)if cond2'等等。事實上,關於關係中的「.all」應該是什麼意思?它是「讓我符合這個標準的所有項目」或「忽略所有以前的標準並獲得所有記錄」? –