在 Rails 5.2 上使用 roo 读取电子表格时如何避免导入 nil 对象?
How to avoid importing nil object when reading spreadsheet with roo on Rails 5.2?
我的应用程序基于值列表(字典)管理层次分类。在某些时候,我需要从 Excel sheet 导入父子关系,并创建持久化的 ValuesToValues 对象。
基于 Ryan Bates 的 RailsCast 396,我创建了主循环为的导入模型:
(2..spreadsheet.last_row).map do |i|
# Read columns indexes
parent = header.index("Parent") +1
level = header.index("Level") +1
code = header.index("Code") +1
# Skip if parent is blank
next if spreadsheet.cell(i, parent).blank?
# Count links
@links_counter += 1
parent_values_list_id = values_lists[((spreadsheet.cell(i, level).to_i) -1)]
child_values_list_id = values_lists[spreadsheet.cell(i, level).to_i]
parent_value_id = Value.find_by(values_list_id: parent_values_list_id, code: spreadsheet.cell(i, parent).to_s).id
child_value_id = Value.find_by(values_list_id: child_values_list_id, code: spreadsheet.cell(i, code).to_s).id
link_code = "#{parent_values_list_id}/#{spreadsheet.cell(i, parent)} - #{child_values_list_id}/#{spreadsheet.cell(i, code)}"
link_name = "#{spreadsheet.cell(i, parent)} #{spreadsheet.cell(i, code)}"
link = ValuesToValues.new( playground_id: playground_id,
classification_id: @classification.id,
parent_values_list_id: parent_values_list_id,
child_values_list_id: child_values_list_id,
parent_value_id: parent_value_id,
child_value_id: child_value_id,
code: link_code,
name: link_name
)
end
问题是,当在没有父值的情况下获取根值时,循环会创建一个 nil 对象,该对象不会通过以后的验证。
如何构建循环以仅考虑 父 单元格不为空的行?
我最终决定管理我自己的导入值数组,而不是使用基于筛选的 sheet 行的数组。
我在主循环周围添加了以下代码:
# Create array of links
linked_values = Array.new
# start loading links for each values list
(2..spreadsheet.last_row).map do |i|
...
和
...
linked_values << link
end
linked_values
返回linked_values数组,只包含有效的链接记录。
我的应用程序基于值列表(字典)管理层次分类。在某些时候,我需要从 Excel sheet 导入父子关系,并创建持久化的 ValuesToValues 对象。
基于 Ryan Bates 的 RailsCast 396,我创建了主循环为的导入模型:
(2..spreadsheet.last_row).map do |i|
# Read columns indexes
parent = header.index("Parent") +1
level = header.index("Level") +1
code = header.index("Code") +1
# Skip if parent is blank
next if spreadsheet.cell(i, parent).blank?
# Count links
@links_counter += 1
parent_values_list_id = values_lists[((spreadsheet.cell(i, level).to_i) -1)]
child_values_list_id = values_lists[spreadsheet.cell(i, level).to_i]
parent_value_id = Value.find_by(values_list_id: parent_values_list_id, code: spreadsheet.cell(i, parent).to_s).id
child_value_id = Value.find_by(values_list_id: child_values_list_id, code: spreadsheet.cell(i, code).to_s).id
link_code = "#{parent_values_list_id}/#{spreadsheet.cell(i, parent)} - #{child_values_list_id}/#{spreadsheet.cell(i, code)}"
link_name = "#{spreadsheet.cell(i, parent)} #{spreadsheet.cell(i, code)}"
link = ValuesToValues.new( playground_id: playground_id,
classification_id: @classification.id,
parent_values_list_id: parent_values_list_id,
child_values_list_id: child_values_list_id,
parent_value_id: parent_value_id,
child_value_id: child_value_id,
code: link_code,
name: link_name
)
end
问题是,当在没有父值的情况下获取根值时,循环会创建一个 nil 对象,该对象不会通过以后的验证。
如何构建循环以仅考虑 父 单元格不为空的行?
我最终决定管理我自己的导入值数组,而不是使用基于筛选的 sheet 行的数组。
我在主循环周围添加了以下代码:
# Create array of links
linked_values = Array.new
# start loading links for each values list
(2..spreadsheet.last_row).map do |i|
...
和
...
linked_values << link
end
linked_values
返回linked_values数组,只包含有效的链接记录。