我在 Erb (Rails 3.0.7) 中打开了日志显示并产生以下结果
1.8.7 :004 > User.first
User Load (4.3ms) SELECT `users`.* FROM `users` LIMIT 1
=> #<User id: 1, email: "user@project.ru">
1.8.7 :005 > User.first(1)
User Load (0.4ms) SELECT `users`.* FROM `users`
=> #<User id: 1, email: "user@project.ru">
1.8.7 :008 > User.first(2)
User Load (0.4ms) SELECT `users`.* FROM `users`
=> [#<User id: 1, email: "user@project.ru", #<User id: 2, email: "user@gmail.com">]
所以我们可以看到,当您调用 first 时不带参数,它会按预期工作,但是当我们调用 first 并带有 number 作为参数时,它会加载 DB 的所有用户,然后只留下 number 元素用户数组。
在first 的recent Rails code 中看起来像这样
def first(*args)
if args.any?
if args.first.kind_of?(Integer) || (loaded? && !args.first.kind_of?(Hash))
limit(*args).to_a
else
apply_finder_options(args.first).first
end
else
find_first
end
end
所以还可以。但在older version like Rails 3.0.7 是:
def first(*args)
if args.any?
if args.first.kind_of?(Integer) || (loaded? && !args.first.kind_of?(Hash))
to_a.first(*args)
else
apply_finder_options(args.first).first
end
else
find_first
end
end
如您所见,first 参数是否为Integer ActiveRecord 加载所有数据,将其转换为数组并调用 Array 的 first 方法,该方法具有以下行为:http://www.ruby-doc.org/core-1.9.3/Array.html#method-i-first