мне нужно получить идентификатор пользователя из результата запроса - PullRequest
0 голосов
/ 19 января 2019

запрашиваю из моей таблицы пользователей, используя имя пользователя, как мне получить идентификатор пользователя из объекта запроса User.where (user_name: "john")

Моя цель - получить идентификатор пользователя: 5, я думал, что это так же просто, как (.id), но это не работает

=> #<ActiveRecord::Relation [#<User id: 5, user_name: "john", user_city: "India", created_at: "2019-01-19 18:02:32", updated_at: "2019-01-19 18:02:32">]> 

Ответы [ 2 ]

0 голосов
/ 20 января 2019

Если вы действительно пытаетесь получить идентификатор (т. Е. Не используете никаких других атрибутов объекта), обычно лучше сформулировать это как .pluck. Это требует меньше времени для инстанцирования ActiveRecord и делает работу по запросу более эффективным использованием индексов вашей базы данных. Пока User#user_name уникален (и я надеюсь на это!), Он будет возвращать массив длины 1.

User.where(user_name: "John").first.&id 
   # SELECT "users".* FROM "users" WHERE "users"."user_name" = "John" 
   # ORDER BY "users" ASC LIMIT 1
   # => 1 or nil

User.where(user_name: "John").pluck(:id).first
   # SELECT "users"."id" FROM "users" WHERE "users"."user_name" = "John"
   # => 1 or nil

К сожалению, find_by и его помощники не работают таким образом с pluck, и оба эти оператора вместо этого приводят к ошибкам

User.find_by(user_name: "John").pluck(:id)
User.find_by_user_name("John").pluck(:id)
0 голосов
/ 19 января 2019

Материализованный where вернет коллекцию, поэтому вы можете получить первую запись с помощью .first

User.where(:user_name => "john").first&.id

или использовать find_by, который вернет первую запись, которая удовлетворяет условию.

User.find_by(:user_name => "john")&.id
...