我有一个.txt文件,其中包含如下属性:
"12345", "1", "Kent"
"67890", "1", "New Castle"
我需要这个来更新我的县模型,所以我有这个rake任务:
namespace :data do
desc "import data from files to database"
task :import => :environment do
file = File.open(File.join(Rails.root, "lib", "tasks", "counties.txt"), "r")
file.each do |line|
attrs = line.split(", ")
c = County.find_or_initialize_by_number(attrs[0])
c.state_id = attrs[1]
c.name = attrs[2]
c.save!
end
end
end
一切似乎都很好,但是当我检查控制台以确保它被正确导入时,我明白了:
#<County id: 2, name: nil, number: 0, state_id: 0, created_at: "2013-08-04 17:44:11", updated_at: "2013-08-04 17:44:11">
我知道它实际上正在导入一些内容,因为它创建了正确数量的County记录,但实际上并没有正确地更新属性。我确定我错过了一些非常明显但我找不到的东西!
答案 0 :(得分:0)
假设:County.number被定义为整数字段。
你的line.split后面的attrs [0]是“\”12345 \“”(一个字符串)。 find_by方法将查找键默认为0(整数),因为它正在查找整数字段(数字)。这可以解释为什么当您从文本文件中的第一个数据列中手动删除引号时,代码的工作原理。
基于此根本原因,可能有多种方法可以解决您的问题。这是一个丑陋的方式:
c = County.find_or_initialize_by_number(Integer(attrs[0].gsub(/\"/, '')))
理想情况下,我会在执行行文本拆分时修剪(或gsub)引号。