#ruby-on-rails #ruby
Вопрос:
У меня есть массив объектов, и я хотел бы взять элементы с 1 по 4, но take
не принимаю диапазон.
user.addresses.take(1...4)
Каков способ достичь этого? В Rails, так что, если есть какое-то дополнение ActiveSupport, я тоже мог бы это использовать.
Комментарии:
1. Это
1
первый элемент или второй? Потому что индексы массива основаны на нуле.2. @Стефан в данном случае, второй.
3. Если
addresses
есть связь и есть много записей, которые вы, возможно, захотите использоватьuser.addresses.offset(1).limit(4)
, что превратит это в запрос к базе данных.
Ответ №1:
take
Метод Ruby принимает одно целое значение для количества элементов, которые необходимо принять. Вызов [0, 1, 2, 3, 4].take(4)
вернет 0-й, 1-й, 2-й и 3-й элементы массива, или [0, 1, 2, 3]
.
Если вы хотите пропустить 0-й элемент, вы можете подумать slice
. Вызов [0, 1, 2, 3, 4].slice(1..)
вернется [1, 2, 3, 4]
. Вы можете ограничить диапазон, чтобы выбрать подмножество. Вы также можете использовать []
в качестве метода в массиве, как slice
псевдоним для []
. Синтаксис бесконечного диапазона x..
был введен в Ruby 2.6. В более ранних версиях Ruby вы могли бы сделать это с 1..-1
помощью instead.
Комментарии:
1. Или более кратко, как просто:
[0, 1, 2, 3, 4][1..]
2. @ChrisDutton Да, я добавлю это. Обычно я предпочитаю
slice
быть немного более откровенным, и это менее сбивает с толку людей, происходящих из не рубинового фона.3. Для более описательного подхода также
ary.drop(1).take(4)
есть, но в большинстве случаев вы увидитеary[1, 4]
(возьмите 4, начиная с 1) илиary[1..4]
(возьмите элементы от 1 до 4) из-за краткости.