#ruby #arrays
#ruby #массивы
Вопрос:
У меня есть массив пользовательских объектов приложения Rails (пользователей), и я собираю записи электронной почты из этих объектов в новый массив. Я устал от этого:
emails = []
users.each {|user| emails << user.email}
Есть ли способ объявить и использовать массив за один раз в таком блоке перечислителя?
Комментарии:
1. Теперь, когда мой Rails-fu набрал силу, я знаю, что для этого нужно использовать pluck . Например,
User.where(<some_condition>).pluck(:email)
Ответ №1:
Используйте #collect
метод
users.collect {|user| user.email }
# in short
users.collect(amp;:email)
собирать электронные письма будет приятно читать, а не сопоставлять электронные письма, поэтому я буду использовать #collect
. Но оба метода являются синонимами друг друга.
Комментарии:
1.
Array
конечно, имеет этот метод и действует так же, ноusers
может и не бытьArray
. Что это такое, этоEnumerable
: ruby-doc.org/core-2.1.2/Enumerable.html#method-i-collect2. @D-side Спасибо… Нет аргумента 🙂
Ответ №2:
Есть #each_with_object
метод.
users.each_with_object( [] ) {|user, emails| emails << user.email}
Не очень хороший пример, collect
здесь он работает намного лучше, так как вам нужен массив. Однако, если вам когда-нибудь случится использовать другой контейнер, а не массив (возможно, какой-то пользовательский класс), это может быть удобно.
И я также должен отметить, что это очень похоже ActiveRecord
на использование, поскольку речь идет о Rails. Так что вы можете счесть #pluck
полезным:
Я не могу предоставить здесь равный фрагмент кода, потому что я понятия не имею, что у вас есть users
. Но вот похожий фрагмент:
User.all.pluck(:email)