祖先:如何从数组创建类别和子类别?

时间:2018-01-24 09:49:43

标签: ruby-on-rails arrays ruby ancestry

我的数组category = ["Components for PC", "Soft", "OS"]
元素的数量可以有所不同 创建这些数组元素Category(来自 .csv 文件)。 在数组category中,我需要category[0]是父级,category[1] - 子级别,但是父级category[2]

PC的组件=> Soft => OS

使用gem Ancestry

对于作品的两个元素这样的代码(虽然丑陋):

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

如何为任意数量的元素创建类别和子类别?

2 个答案:

答案 0 :(得分:1)

假设您在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

答案 1 :(得分:1)

对于每个csv行:

  1. 获取一系列类别名称
  2. 获取根类别名称并将其从数组中删除
  3. 按名称
  4. 查找或创建根类别

    然后,对于数组中剩余的每个类别名称:

    1. 按名称
    2. 查找或创建子类别
    3. 将类别设置为下一个类别的父级
    4. 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