当我们必须从第6个索引开始获取6个元素时,我不理解执行Model.limit(6).offset(5)
的原因。我认为它应该是Model.offset(5).limit(6)
,因为我们首先必须告诉我们必须从哪个索引开始检索元素,然后将搜索限制为作为参数传递给限制的元素数量,而不是反过来
答案 0 :(得分:7)
你错误地认为链式轨道方法的顺序很重要。事实上,它没有。除非调用实际执行方法,否则所有这些方法只会更改正在准备的内部查询:
> User.limit(6).class
#⇒ User::FriendlyIdActiveRecordRelation
> User.offset(5).class
#⇒ User::FriendlyIdActiveRecordRelation
也就是说,顺序无关紧要,除非有人调用执行方法,例如each
(直接或通过to_a
,map
之类的方法等)或{{ 1}}。
pluck
答案 1 :(得分:0)
这两个是等价的。当您评估并从中获取结果时,ActiveRecord会生成SQL。使用.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"
答案 2 :(得分: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]