我已将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可能会丢失我的记录。(无法读取现有数据库吗?)
有人能指出我的错吗?
答案 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