【发布时间】:2014-05-06 17:04:11
【问题描述】:
我正在从 CSV 文件导入数据(使用 Smarter CSV)。我在任务中按如下方式处理此文件:
require 'smarter_csv'
desc "Import Players from World data"
task :import => [:environment] do
file = "db/data/players.txt"
SmarterCSV.process(file, {
:user_provided_headers => [
"grepo_id", "name", "alliance_id", "points", "rank", "towns"
], headers_in_file: false
}) do |array|
# post-process the data from each row
array.each do |a|
a[:name] = CGI::unescape(a[:name]).force_encoding('UTF-8')
end
# Create Player
Player.create(array.first)
end
end
从:user_provided_headers 可以看到传递给每个玩家的变量。
变量'grepo_id' 和'name' 始终保持不变,但其他变量会随着时间而变化。
我正在尝试Find_or_create 或Update 给定用户。对于引用用户,我使用'grepo_id',因为这个变量对每个玩家都是唯一的。
但似乎我错过了一些东西,无论我尝试什么都去游泳,我认为我在这里弄错了方法。
在这种情况下我能做什么:
- Find_by
'grepo_id' - 如果存在更新其他变量(如果有任何变化)
- 如果不存在,则创建。
干杯
编辑:来自 Smarter CSV 文档
SmarterCSV.process(filename) do |array|
# we're passing a block in, to process each resulting hash / =row (the block takes array of hashes)
# there is only one hash in each array
MyModel.create( array.first )
end
【问题讨论】:
标签: ruby-on-rails ruby csv import