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

Ank*_*gla 1 ruby-on-rails rails-activerecord

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

Ale*_*kin 7

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

> User.limit(6).class
#? User::FriendlyIdActiveRecordRelation
> User.offset(5).class
#? User::FriendlyIdActiveRecordRelation
Run Code Online (Sandbox Code Playgroud)

尽管如此,为了以防无所谓,除非一个调用执行方法,像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"
Run Code Online (Sandbox Code Playgroud)


Ho *_*Man 3

两者是等价的。当您评估并从中获取结果时,SQL 是由 ActiveRecord 生成的。使用.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"
Run Code Online (Sandbox Code Playgroud)