2015-01-22 5 views
1

MySQL 데이터베이스에 대한 초기 데이터에 csv 파일을 사용했습니다. 방법은 아래 (.. 그것이 내가 지금까지 완벽하게이 과정을 이해하지 못하는 경우가 있습니다, 그래서 내가, 유래 여기에 이전을 요청). 그 가져 오기 프로세스에 대한db의 특정 행을 csv 파일로 업데이트하는 방법 (레일스)

# 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 (updated), addr (updated) 열이 없습니다.

# 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 

는 I가 [0] 업데이트 할 restaurant_id시킨 후, 다음에 이름과 주소를 업데이트 행과 특정 행을 읽을 수있는 사상 (행 [1] 행 [2]). 그러나 내가 rake db:restaurants_update 할 때 ActiveRecord :: RecordNotFound : id = 1000001 (내가 csv 파일의 첫 번째 행이며 데이터베이스에 id가 1000001 인이 레스토랑이 있음)을 찾을 수 없습니다. 콘솔에서 체크했습니다. Restaurant.find(1000001)). import.rake가 내 기록을 잃어 버렸을 수도 있습니다. (기존 데이터베이스를 읽을 수 없습니까?)

누구든지 내 잘못을 지적 할 수 있습니까?

+0

나는 u를 사용하여 시도 할 수 있습니다, 확실하지 오전하지만'Restaurant.find_by_id (N)', 내가 CSV에 저장된 값은 당신이 행의 값을 확인할 수 있습니다 형식 – Sontya

+0

[0], 행은 다른 생각 해시 그래서'r_hash = row.to_hash, rest = Restaurant.where (id : r_hash [ "id"]), rest.first.update_attributes (r_hash)' – Sontya

+0

@Sontya 나는 당신이 말한 것을 시도하고 이것을 얻었다'NoMethodError : undefined method [ "1000001", nil, nil] : toll에 대한 to_hash. 맞아? 나는'No_ethodError : undefined method 'update_attributes for nil : NilClass'를'find_by_id (n)'시도했을 때 –

답변

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 
관련 문제