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

select の結果は、明示的に並べ替えるまで並べ替えられません。ORDER BYレコードを「最初」と見なす基準を指定する句を追加しない限り、特定の「最初」のレコードはありません。

特に Ruby では、.firstメソッド (またはfind(:first)) は順序付けを適用しないため、結果は (本質的に) ランダムになります。「最初の」レコードを毎回同じにする必要がある場合は、結果を並べ替える必要があります。

User.order(:id).first

これは (やや奇妙に)自動的適用される.lastメソッドとは対照的です。order(:id)

于 2013-02-26T17:27:58.607 に答える