#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
byfind_or_create_by
, чтобы избежать дубликатов.