首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Model.offset().limit()和Model.limit().offset()的区别

Model.offset().limit()和Model.limit().offset()的区别
EN

Stack Overflow用户
提问于 2017-07-31 14:26:20
回答 3查看 8.1K关注 0票数 2

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

EN

回答 3

Stack Overflow用户

发布于 2017-07-31 15:03:23

问题是,您错误地认为链接的rails方法的顺序很重要。事实上,它不是。除非调用真正的执行方法,否则所有这些方法都只是更改正在准备的内部查询:

代码语言:javascript
复制
> User.limit(6).class
#⇒ User::FriendlyIdActiveRecordRelation
> User.offset(5).class
#⇒ User::FriendlyIdActiveRecordRelation

也就是说,顺序并不重要,除非调用执行方法,如each (直接调用或通过to_amap等方法调用)。或者pluck

代码语言:javascript
复制
> 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"
票数 8
EN

Stack Overflow用户

发布于 2017-07-31 14:36:30

这两个是等价的。当您对SQL进行计算并从中获取结果时,ActiveRecord会生成SQL。使用.to_sql查看生成的SQL:

代码语言:javascript
复制
[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"
票数 1
EN

Stack Overflow用户

发布于 2017-07-31 14:37:37

您的问题中提到的两种情况生成的sql查询是相同的,因此它们产生相同的结果。因此,对于相同的模型,使用offset和limit的顺序基本上没有区别。

代码语言:javascript
复制
>> 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]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45408783

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档