Ответ 1
pluck
полезно выполнить минимальный запрос db.
Когда у вас есть массив, просто используйте map
:
arr.map(&:email)
Если я делаю User.all.pluck(:email)
, тогда он отлично работает.
Но если я делаю
arr = Array.new
arr = User.all
а затем
arr.pluck(:email)
это вызывает следующую ошибку
undefined method `pluck' for #<Array:0x007f4ff8daf3c8>
что означает, что я не могу использовать pluck с массивами, поэтому как мы можем получить конкретное значение поля из массива записей только в одной строке, как указано выше. Я не хочу прокручивать каждую запись в массиве.
pluck
полезно выполнить минимальный запрос db.
Когда у вас есть массив, просто используйте map
:
arr.map(&:email)
Используйте collect
, это метод Array:
arr.collect{|u| u.email}
pluck(:x)
является эквивалентом select(:x).map(&:x)
в коллекции ActiveRecord
.
Если у вас есть массив, Array#map
и его псевдоним Array#collect
выполняют одно и то же задание.
Если вы используете
User.scoped.pluck(:email)
ваш запрос будет похож на
SELECT users.email FROM users
Итак, чтобы ответить на вопрос, вы не можете использовать pluck для массива, pluck - это метод ActiveRecord::Calculations
, а не массив.
Преобразование в массив таким образом является хоггером памяти. Вместо этого вы можете использовать:
arr = User.scoped
arr.pluck :email
или в более удобном для чтения:
User.scoped.pluck :email
Это гарантирует, что фактические объекты пользователя не будут загружены в память до тех пор, пока они не потребуются.