2013-08-04 4 views
1

У меня есть файл .txt полного атрибутов, как так:Рек не обновляет

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

Мне нужно это, чтобы обновить свою модель County, и поэтому у меня есть эти грабли задача:

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"> 

I знаете, что он фактически импортирует что-то, потому что он создал точное количество записей графства, но на самом деле он не обновляет атрибуты правильно. Я уверен, что упускаю что-то очень очевидное, но я не могу его найти!

+0

Вы пытались сделать эти шаги в консоли? – mathieugagne

+0

Есть ли у вас обратные вызовы after_save или что-то подобное? – mathieugagne

+0

Просто что-то обнаружил: когда я меняю данные следующим образом: 54109, 5, «Вайоминг», т. Е. Удаляет кавычки вокруг целых чисел, тогда он будет обновляться. Поэтому моя проблема в том, что он читает кавычки, а затем не обновляет целочисленные поля. Есть ли лучший способ написать line.split? – krstck

ответ

0

Успение: Номер графства определяется как целое поле.

attrs [0] после того, как ваш line.split выходит как "\" 12345 \ "" (строка). Метод find_by по умолчанию проверяет ключ поиска на 0 (целое число), учитывая, что он ищет целое поле (число). Это объясняет, почему ваш код работает, когда вы вручную вычеркиваете кавычки из первого столбца данных в текстовом файле.

Основываясь на этой первопричине, может быть несколько способов решения проблемы. Вот уродливый способ:

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

В идеале, я бы отсечь (или GSUB) приводит при выполнении строки текста раскола.

+0

County.number - целое число, а также state_id. Но по какой-то причине снятие кавычек только срабатывало. Он работал, когда я удалил его во втором столбце данных из последней строки в текстовом файле, но не будет работать, если удалить его из первого столбца. – krstck

+0

Кроме того, когда я удаляю все кавычки из текстового файла, ничего не происходит вообще. – krstck

+0

Я до сих пор не знаю, почему в этом случае это не сработало, но в итоге я удалил модель округа и снова создал ее, а затем выполнил задачу рейка со всеми удаленными цитатами. Отлично работает! – krstck