1

我有一个充满属性的 .txt 文件,如下所示:

"12345", "1", "Kent"
"67890", "1", "New Castle"

我需要这个来更新我的 County 模型,所以我有这个 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"> 

我知道它实际上是在导入一些东西,因为它创建了正确数量的县记录,但实际上并没有正确更新属性。我确定我错过了一些非常明显的东西,但我找不到它!

4

1 回答 1

0

假设: County.number 被定义为一个整数字段。

在你的 line.split 之后的 attrs[0] 是 "\"12345\"" (一个字符串)。find_by 方法默认查找键为 0(整数),因为它正在查找整数字段(数字)。这可以解释为什么当您从文本文件的第一个数据列中手动删除引号时,您的代码会起作用。

基于此根本原因,可能有多种方法可以解决您的问题。这是一个丑陋的方式:

c = County.find_or_initialize_by_number(Integer(attrs[0].gsub(/\"/, '')))

理想情况下,我会在进行行文本拆分时修剪(或 gsub)引号。

于 2013-08-04T19:30:40.410 回答