«объединить» два массива и выполнить итерацию по новому массиву в Rails

#arrays #ruby-on-rails-3

#массивы #ruby-on-rails-3

Вопрос:

Допустим, у меня есть

 @colors = @product.colors.all
@storages = Storage.all
  

Мне нужно перебрать все комбинации для этих двух и создать запись в другой модели

Как указать приложению запускать этот вызов для каждого цвета, хранилища и назначать соответствующие идентификаторы?

 Stock.find_or_create_by_product_id(:product_id => @id, :color_id => XXX, :storage_id => XXX)
  

Ответ №1:

У меня есть для вас секрет: у Ruby есть документация. Существует множество действительно потрясающих методов, которые скрыты от плохих разработчиков, которые вы можете использовать, чтобы выглядеть потрясающе для своих коллег, и все они раскрываются тем, кто в курсе, в документации. Например, Array#product — это действительно потрясающий метод, который примет другой массив в качестве аргумента и вернет массив с каждой комбинацией этих двух массивов (на самом деле, потребуется неограниченное количество массивов и вернутся все комбинации всех массивов). Довольно круто, не так ли?

Вот как вы могли бы использовать это, чтобы упростить вашу ситуацию:

 @colors = @product.colors.all
@storages = Storage.all

@colors.product(@storages).each do |color, storage|
  Stock.find_or_create_by_product_id(:product_id => @id, :color_id => color.id, :storage_id => storage.id)
end
  

Добро пожаловать в секретный клуб. 🙂

Комментарии:

1. Привет, спасибо за ответ. Я слишком быстро просмотрел документ array и пропустил этот. Спасибо, что указали на это. Решено. Для других вы можете заменить метод create by find_or_create_by , чтобы избежать дубликатов.