Как проверить, разделяет ли массив элементы с другим массивом в Ruby? - PullRequest
0 голосов
/ 24 октября 2018

В настоящее время я пытаюсь проверить, разделяет ли массив записей элементы с другим массивом.

Я использую оператор splat для условного выражения, подобного этому:

if @user.tags.include?(*current_tags)
    # code
end

Thisработает, когда присутствуют теги, но возвращает эту ошибку, когда current_tags пусто.

неверное количество аргументов (задано 0, ожидается 1)

Это часто происходит в моем приложении, поэтому мне было интересно, есть ли альтернативы для достижения этой же функциональностино в противном случае это не взорвется, если current_tags - пустой массив.

Ответы [ 3 ]

0 голосов
/ 24 октября 2018

Другой способ сделать то же самое:

if current_tags.any? { |tag| @user.tags.include?(tag) }
  ...
end

, если вы хотите быть уверены, что хотя бы один из current_tags находится в массиве @user.tags или

if current_tags.all? { |tag| @user.tags.include?(tag) }
  ...
end

в случае, если все теги должны быть там.

Прекрасно работает и с пустым current_tags.

0 голосов
/ 24 октября 2018

Вместо этого вы можете использовать пересечение для решения этой проблемы.Пересечение двух массивов - это массив, содержащий только элементы, присутствующие в обоих.Если пересечение пустое, у массивов не было ничего общего, иначе у массивов были общие элементы из результата:

if (current_tags & @user.tags).any?
  # ok
end
0 голосов
/ 24 октября 2018

Добавьте еще одно условие, если current_tags.present?

if current_tags.present? && @user.tags.include?(*current_tags)
    # code
end

Как

2.3.1 :002 > [].present?
 => false 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...