为什么带有限制的rails中的查询不起作用,除非.all被放在最后

Sim*_*ast 10 rake activerecord ruby-on-rails

我有这样的查询:

locations = Location.order('id ASC').limit(10)
Run Code Online (Sandbox Code Playgroud)

返回一个包含500个左右记录的数组 - 表中的所有记录 - 即limit子句被忽略.

然而,如果我把.all放在最后:

locations = Location.order('id ASC').limit(10).all
Run Code Online (Sandbox Code Playgroud)

它工作并返回10条记录.

这个代码是在rake任务中运行的,如果这有任何不同,我正在使用PostgreSQL.

它为什么这样做?当然不应该要求.all.我错过了什么?

Mik*_* A. 8

我认为行为取决于您locations在设置变量后如何处理变量.这是因为Location.order('id ASC').limit(10)不是查询记录而是返回类型的对象ActiveRecord::Relation.一旦你打电话时才会发生的查询all,first,each,map,等该对象上.

在我的测试中,

Location.order('id ASC').limit(10).map { |l| l.id }
Run Code Online (Sandbox Code Playgroud)

如您所料,返回10个数组的数组.但

Location.order('id ASC').limit(10).count
Run Code Online (Sandbox Code Playgroud)

返回数据库中的位置总数,因为它执行SQL

SELECT COUNT(*) FROM "locations" LIMIT 10
Run Code Online (Sandbox Code Playgroud)

它返回位置行的完整计数(限制是返回的行数,而不是计数本身).

因此,如果您Location.order('id ASC').limit(10)通过迭代来处理数组的结果,则应该得到与添加时相同的结果all.如果你打电话count,你就不会.有点不幸,因为我认为理想情况下它们的行为应该相同,你不应该知道你正在处理的是一个ActiveRecord::Relation而不是一个数组.