Model.offset()。limit()和Model.limit()。offset()之间的区别

时间:2017-07-31 06:26:20

标签: ruby-on-rails rails-activerecord

当我们必须从第6个索引开始获取6个元素时,我不理解执行Model.limit(6).offset(5)的原因。我认为它应该是Model.offset(5).limit(6),因为我们首先必须告诉我们必须从哪个索引开始检索元素,然后将搜索限制为作为参数传递给限制的元素数量,而不是反过来

3 个答案:

答案 0 :(得分:7)

你错误地认为链式轨道方法的顺序很重要。事实上,它没有。除非调用实际执行方法,否则所有这些方法只会更改正在准备的内部查询:

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

也就是说,顺序无关紧要,除非有人调用执行方法,例如each(直接或通过to_amap之类的方法等)或{{ 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]