Лучший способ получить одно поле в одной строке кода с ActiveRecord (Rails 4)

Я просто хочу получить скалярные данные (например, int, string и т. Д.) Из одного поля строки. Если в БД нет строки, я хочу, чтобы она была нулевой.

Строка кода ниже работает хорошо, если есть строка:

User.select(:email).where(***).first.email

Но нет, он вызовет "NoMethodError: неопределенный метод" email "для nil:NilClass".

Поэтому я должен использовать метод "попробовать" ActiveSupport.

User.select(:email).where(***).first.try(:email)

Или я должен сначала использовать pluck + Array#.

User.select(:email).where(***).pluck(:email).first

Но оба эти кода немного длинны для меня.

Есть ли лучший способ сделать это? Если есть интерфейс, как показано ниже, я буду очень счастлив.

User.where(***).field(:email)
# => returns "abc@example.com" or nil

1 ответ

Я бы сделал

(user = User.select(:email).where(***).first) && (user.email)

Это вернет либо адрес электронной почты пользователя, либо ноль, если нет пользователя.

Если вам нужна только одна строка, вы должны использовать find_by. Таким образом, вы можете провести рефакторинг кода вот так.

User.find_by(***).try(:email)
Другие вопросы по тегам