2015-02-15 3 views
0

У меня есть таблица category_aliases, в которой есть столбец aliase (тип массива) и столбец category_id, что указывает на таблицу categories.петля внутри петли activerecord

У меня есть products стол, который имеет category column.

есть categories стол.

Я хочу просмотреть все продукты (много), которые имеют старые категории и сопоставить их с новыми категориями.

Поэтому мне нужно проверить, если какой-либо из category_aliases.aliase (aliase массив старых категорий) включает в себя это product «s category, и если да, то я хочу, чтобы отобразить его в новую категорию из categories таблицы.

То, что я попытался это:

Product.all.each do |p| 
    CategoryAlias.all.each do |ca| 
    if ca.aliase.include? p.category 
     p.update_column(:category, Category.find(ca.category_id).name) 
    else 
     p.update_column(:category, 'undefined') 
    end 
    end 
end 

Но я, конечно, что-то отсутствует, потому что даже если я знаю, что там почти всегда должно быть совпадение, он обновляет p.category на 'undefined' все время.

+0

В таких случаях, я хотел бы пойти на 'Оферте/регистратор привода development'; добавьте много команд 'puts' или' logger.info' на каждом шаге и точно укажите, где ожидаемый результат отличается от фактического. :-) –

+0

Является ли ваш 'aliase' массив внутри базы данных или выполняется с помощью' serialize' (т. Е. Блога YAML внутри базы данных)? –

+0

@muistooshort Я использую postgress и сохраняю массив в db ('t.text: aliase, aray: true') –

ответ

3

Вам не нужно перебирать все категории («каждый») в каждом контуре продукта, вам просто нужно найти подходящую категорию detect. Кроме того: если вам нужно перебрать много продуктов, это может быть лучше использовать find_each:

category_aliases = CategoryAlias.pluck(:name, :aliase) 

Product.find_each do |product| 
    category = category_aliases.detect { |ca| ca.aliase.include? product.category } 

    if category 
    p.update_column(:category, cateory.name) 
    else 
    p.update_column(:category, 'undefined') 
    end 
end 
+0

, хотя вы смешали несколько столбцов, идея понятна и работает как шарм! Огромное спасибо! –

+0

эй человек, если у вас есть еще несколько минут, пожалуйста, помогите мне с еще одной проблемой. Теперь я изменил столбец 'products.category' как массив. Это сделано, потому что может быть ситуация, где мало «ca.aliase». включить 'product.category'.Как бы я пошел с стиранием старой product.category, а затем нажав новые? Большое спасибо! –

+0

Должен ли я просто сначала вставлять новые категории в массив product.category, а затем перебирать продукты сначала, или есть умное решение? –

1

я вижу ряд проблем в коде:

  1. Вы изменили category поле на каждой итерации. Это приводит к обновлению до 'undefined', если запись CategoryAlias не содержит категории. Тогда все остальные итерации не имеют смысла.
  2. Вам необходимо разбить внутренний цикл сразу после того, как обновлен category.
  3. Вам необходимо обновить category до 'undefined' во внешнем цикле, если в списке нет категории псевдонимов category_aliases.
+0

Категория - это столбец продуктов, поэтому это не отношение. –

+0

Я обновил ответ, нашел много проблем в коде. – Featalion

+0

И, я думаю, что ответ @ spickermann содержит гораздо лучший код для вашего дела. – Featalion

Смежные вопросы