如何使用csv文件更新db中的特定行?(rails)

时间:2015-01-22 05:33:47

标签: mysql ruby-on-rails csv rake rails-activerecord

我已将csv文件用于MySQL数据库的初始数据。下面的方法是针对那个导入过程的。(我之前在这里讨论过stackoverflow,所以可能是因为我现在还没有完全理解这个过程..)

# lib/tasks/import.rake
require 'csv'

namespace :db do
  task :restaurants => :environment do
    CSV.foreach('public/seed_data/restaurants.csv') do |row|
      record = Restaurant.new(
        :name => row[0],
        :addr => row[1]
      )
      record.save!
    end
  end
end

但是现在我必须更新一些特定的行,这些行在我的第一次db导入后已经改变了。所以我刚才改变了我的第一种方法。我的update.csv文件有id,name(已更新),addr(已更新)列,没有头。

# lib/tasks/import.rake
require 'csv'

namespace :db do
  task :restaurants_update => :environment do
    CSV.foreach('public/seed_data/update.csv') do |row|
      n = row[0]
      record = Restaurant.find(n)
      record.update_attributes(
        :name => row[1],
        :addr => row[2]
      )
      record.save!
    end
  end
end

我认为它可以读取具有row [0]的特定行,其中要更新restaurant_id,然后使用以下(行[1]和行[2])更新名称和地址。但是当我rake db:restaurants_update时,它会说 ActiveRecord :: RecordNotFound:找不到ID = 1000001的餐馆(这是我在csv文件中的第一行和我的数据库具有id为1000001的此记录。我在控制台Restaurant.find(1000001)中检查了它。我认为import.rake可能会丢失我的记录。(无法读取现有数据库吗?)

有人能指出我的错吗?

1 个答案:

答案 0 :(得分:0)

如果您只是更新,请使用find_by(id: n)。就个人而言,我建议find_or_create_by,如果不存在,可以更新字段或创建新字段。

# lib/tasks/import.rake
require 'csv'

namespace :db do
  task :restaurants_update => :environment do
    CSV.foreach('public/seed_data/update.csv') do |row|
      n = row[0]
      record = Restaurant.find_or_create_by(id: n)
      record.update_attributes(
        :name => row[1],
        :addr => row[2]
      )
      record.save!
    end
  end
end