ActiveRecord :: Querying # first возвращает третьего члена коллекции - PullRequest
1 голос
/ 30 января 2012
[1] pry(main)> User.first
  User Load (0.4ms)  SELECT "users".* FROM "users" LIMIT 1
=> #<User id: 3, email: "chasity@kiehn.net", encrypted_password: "$2a$10$lqsgKvQuz9iSIu/..FMRJu76H9KNhfVz5x9DmxphC0TK...", reset_password_token: ... >
[2] pry(main)> User.find(1)
  User Load (12.8ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1  [["id", 1]]
=> #<User id: 1, email: "admin@example.com", encrypted_password: "$2a$10$pGDcv0/EgiDk4KcZN9pli.evx5Ni1qOoujQD15HgWH8Y...", reset_password_token: ... >
[3] pry(main)> Product.first
  Product Load (0.6ms)  SELECT "products".* FROM "products" LIMIT 1
=> #<Product id: 1, name: "Ruby on Rails Jr. Spaghetti", created_at: "2012-01-25 10:13:26", updated_at: "2012-01-25 10:13:26", properties: ...>

Это происходит в консоли и во время выполнения и только для модели User. Что может вызвать такое поведение?

Ответы [ 2 ]

5 голосов
/ 30 января 2012

Вы не указали заказ - база данных может свободно заказывать результаты любым удобным для нее способом.Это может быть порядок первичного ключа, это может быть порядок размещения на диске, но без условия заказа нет никаких гарантий.

Если вы хотите, чтобы первая запись была в определенном порядке, убедитесь, что вы запрашиваетеон

1 голос
/ 30 января 2012

User.first совпадает с User.all.first, указанный порядок отсутствует, поэтому БД возвращает список элементов в любом порядке. Если вы хотите получить пользователя с наименьшим идентификатором, используйте User.order("id").first.

Если ваш запрос возвращает несколько элементов, и вы хотите выбрать любой из них, вы можете использовать first без указания порядка.

...