0
1.8.7 :011 > User.find(:first).id
  User Load (0.4ms)  SELECT `users`.* FROM `users` LIMIT 1
 => 1 

1.8.7 :012 > User.find(:first, :select => 'id')
  User Load (0.3ms)  SELECT id FROM `users` LIMIT 1
 => #<User id: 2> 

从我这边...我完全糊涂了。它应该在两个查询中都给我用户 ID 1 对吗?我所知道的是数据库中的第一个用户的 ID 为 1,我知道这个“问题/奇怪的结果”与 MySQL 有关。

SELECT * FROM `users` LIMIT 1;
= 1

SELECT id FROM `users` LIMIT 1;
= 2

SELECT id FROM `users` ORDER BY id ASC LIMIT 1;
= 1
4

1 回答 1

5

在您明确排序之前,不会对来自选择的结果进行排序。没有特定的“第一”记录,除非您添加一个ORDER BY子句,告诉它应该根据哪些标准将记录视为“第一”。

特别是在 Ruby 中,.first方法 (or find(:first)) 不会应用任何排序,因此结果将(基本上)是随机的。如果您需要“第一条”记录每次都相同,则需要对结果进行排序:

User.order(:id).first

这(有点奇怪)与该方法形成鲜明对比,该.last方法自动应用order(:id)

于 2013-02-26T17:27:58.607 回答