当我们必须从第6个索引开始获取6个元素时,我不明白为什么要做Model.limit(6).offset(5)。我认为它应该是Model.offset(5).limit(6),因为我们首先必须告诉索引,我们必须从哪个索引开始检索元素,然后将搜索限制为作为参数传递的元素的数量,而不是反过来。
发布于 2017-07-31 15:03:23
问题是,您错误地认为链接的rails方法的顺序很重要。事实上,它不是。除非调用真正的执行方法,否则所有这些方法都只是更改正在准备的内部查询:
> 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"发布于 2017-07-31 14:36:30
这两个是等价的。当您对SQL进行计算并从中获取结果时,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"发布于 2017-07-31 14:37:37
您的问题中提到的两种情况生成的sql查询是相同的,因此它们产生相同的结果。因此,对于相同的模型,使用offset和limit的顺序基本上没有区别。
>> 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]https://stackoverflow.com/questions/45408783
复制相似问题