Подтвердить что ты не робот

Как собирать электронную почту из массива пользователей

Если я делаю User.all.pluck(:email), тогда он отлично работает.

Но если я делаю

arr = Array.new
arr = User.all

а затем

arr.pluck(:email)

это вызывает следующую ошибку

undefined method `pluck' for #<Array:0x007f4ff8daf3c8>

что означает, что я не могу использовать pluck с массивами, поэтому как мы можем получить конкретное значение поля из массива записей только в одной строке, как указано выше. Я не хочу прокручивать каждую запись в массиве.

4b9b3361

Ответ 1

pluck полезно выполнить минимальный запрос db.

Когда у вас есть массив, просто используйте map:

arr.map(&:email)

Ответ 2

Используйте collect, это метод Array:

arr.collect{|u| u.email}

Ответ 3

pluck(:x) является эквивалентом select(:x).map(&:x) в коллекции ActiveRecord.

Если у вас есть массив, Array#map и его псевдоним Array#collect выполняют одно и то же задание.

Если вы используете

User.scoped.pluck(:email)

ваш запрос будет похож на

SELECT users.email FROM users

Итак, чтобы ответить на вопрос, вы не можете использовать pluck для массива, pluck - это метод ActiveRecord::Calculations, а не массив.

Ответ 4

Преобразование в массив таким образом является хоггером памяти. Вместо этого вы можете использовать:

arr = User.scoped
arr.pluck :email

или в более удобном для чтения:

User.scoped.pluck :email

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