2017-07-31 8 views
0

6番目のインデックスから6つの要素を取得する必要がある場合、Model.limit(6).offset(5)の理由を理解できません。私たちは、最初に要素の取得を開始しなければならないインデックスを指定してから、limitに引数として渡された要素の数に検索を制限しなければならないので、Model.offset(5).limit(6)である必要があると思います。Model.offset()。limit()とModel.limit()の相違点offset()

答えて

0

2つは同等です。 SQLはActiveRecordによって評価され、その結果を得ると、ActiveRecordによって生成されます。

[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クエリは同じであるため、彼らは同じ結果を生成:生成されますSQLを見て.to_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

あなたは誤ってチェーンレールの順序が重要であると考えていますか?実際、そうではありません。 実際の実行メソッドが呼び出されない限り、すべてのこれらの方法は、単に準備されている内部クエリを変更する:1はeachのように、実行メソッドを呼び出していない限り順番だけで、問題ではない、と述べた

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

(直接、または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'はクエリをトリガしません。 「each」はそうです。 –

+0

本当に、地球上の「すべて」はなぜそうではないのですか?クエリーをトリガーすることなく関係に 'all'を呼び出す理由は何でしょうか? Railsは吸う。 – mudasobwa

+0

これは、後でカスタマイズするための「空の」クエリを取得する方法です。 'products = Product.all; products = products.where(query1)if cond1; products = products2.where(query2)if cond2'など。実際には、関係上の '.all'は何を意味するのかはあいまいです。 「この基準に適合するすべてのアイテムを入手してください」または「以前のすべての基準を無視してすべてのレコードを取得しますか? –

関連する問題