Rails导入CSV记录 删除所有并重新创建

19 浏览
0 Comments

Rails导入CSV记录 删除所有并重新创建

我试着基于Rails Cast Import CSV实现一个CSV导入功能。它可以通过查找记录的id来更新和插入新记录,并进行编辑或创建。然而,它没有考虑到从CSV文件中删除的记录。我经验有限,我想到的解决办法是删除所有记录并重新构建它们。但显然,这样会导致性能问题。所以,我想请教你们如何处理这样的问题。

0
0 Comments

问题的原因是通过CSV文件更新记录时,只想保留CSV文件中存在的记录。解决方法是首先删除所有记录,然后插入CSV文件中的记录。可以使用smarter_csv gem来实现后台处理。

# Import CSV records, delete all and recreate
require 'smarter_csv'
# Delete all records
ModelName.delete_all
# Import records from CSV file
options = {
  file_encoding: 'iso-8859-1',
  chunk_size: 1000,
  remove_empty_values: false
}
SmarterCSV.process('path/to/csv/file.csv', options) do |chunk|
  chunk.each do |data|
    # Create record
    ModelName.create(data)
  end
end

以上代码首先使用`delete_all`方法删除所有记录。然后使用`smarter_csv`库来处理CSV文件。可以通过设置`file_encoding`指定文件的编码格式,`chunk_size`指定每次处理的行数,`remove_empty_values`指定是否移除空值。

在`SmarterCSV.process`块中,使用`create`方法逐条创建记录。`create`方法的参数`data`是一个哈希,包含了CSV文件中每一行的数据。

通过以上代码,我们能够实现从CSV文件中导入记录、删除所有记录并重新创建的功能。

0
0 Comments

问题的原因是需要从CSV文件中导入记录,并且在导入之前需要删除已有的记录。解决方法是将要添加的记录的ID添加到一个数组中,然后遍历现有记录并删除不在该数组中的记录。

以下是解决方法的代码:

processed_ids = []
_row.each do |r|
  process r
  processed_ids << r[:id]
end
Object.all.each do |o|
  next if processed_ids.include? o.id
  o.destroy
end

这种方法可能不是最高效的,因为需要遍历所有现有的记录。

0
0 Comments

问题的原因是需要在Rails中导入CSV记录并删除所有记录后重新创建。

解决方法是使用排除查询。首先,将row_ids收集到一个数组中,然后删除所有记录。

ids = []
CSV.foreach(file.path, headers: true) do |row|
  ids << row["id"]
end
Topic.where('id not in (?)', ids).delete_all

完成此操作后,可以运行常规的CSV导入。

0