родословная: как создавать категории и подкатегории из массива?

мой массив category = ["Components for PC", "Soft", "OS"]
Количество элементов может быть разным.
Эти элементы массива создаются Category (из файла .csv). В массиве category мне нужно, чтобы category[0] была родительской, а category[1] - дочерней категорией, но родительская category[2]

Компоненты для ПК => Софт => ОС

Использовать драгоценный камень Родословная

Для двух элементов работает такой код (хоть и некрасивый):

last = nil

csv.each do |row| # rows from the table
  base = row[6].split('/')[0] # first element
  parent_category = Category.create!(name: base) if Category.where(name: base).first.nil? # Create a base category

  row[6].split('/').each do |category| # 
    if Category.where(name: category).first.nil? # if the category does not exist
      last = Category.create!(name: parent_category) if last == nil # create base Category
      # if the base exists, create her child
      child = Category.create!(name: category, ancestry: Category.where(name: base).first.id) if last != nil
    end
  end
end

как создавать категории и подкатегории для любого количества элементов?


person evans    schedule 24.01.2018    source источник


Ответы (2)


Для каждой строки CSV:

  1. Получить массив имен категорий
  2. Получить имя корневой категории и удалить его из массива
  3. Найдите или создайте корневую категорию по ее имени

Затем для каждого имени категории, оставшегося в массиве:

  1. Найдите или создайте дочернюю категорию по ее имени
  2. Установите категорию в качестве родителя для следующих категорий

csv.each do |row| # rows from the table
  category_names = row[6].split('/')

  root_category_name = category_names.shift

  parent_category = Category.find_or_create_by!(name: root_category_name) # Finds or creates the root category

  category_names.each do |category_name|
    parent_category = Category.find_or_create_by!(name: category_name, parent: parent_category) # Finds or creates the child category, which is the root for next categories
  end
end
person pan.goth    schedule 24.01.2018

Предполагая, что вы получаете массив категорий в файле categories.

categories.each_with_index do |category, index|
  if index.zero? 
    parent = Category.create!(name: category)
  else
    Category.create!(name: category, ancestry: parent.id)
  end  
end
person Salil    schedule 24.01.2018