2016-04-09 9 views
0

У меня есть следующий код, который должен обновлять каждую строку в моей модели аренды с атрибутами из каждой строки файла CSV. Строка с идентификатором 1 в базе данных должна иметь свои атрибуты, обновленные со значениями строки 1 в CSV и т. Д. У меня есть 10000 строк в таблице и 10000 (исключая заголовок) в CSV.Обновление столбцов из CSV

Однако вместо обновления атрибутов в модели, где ID = грести он обновляет все строки атрибутов в таблице с первой строки CSV, затем второй и т.д. ...

Любая помощь будет оценен по достоинству!

csv_text = File.read(Rails.root.join('db', 'Lpostcodes.csv')) 
csv = CSV.parse(csv_text, :headers => true) 
csv.each do |row| 
    postcode = row['postcode'] 
    latitude = row['latitude'] 
    longitude = row['longitude'] 
    puts $INPUT_LINE_NUMBER 
    #update a particular row 
    Rental.update($INPUT_LINE_NUMBER, postcode: postcode, latitude: latitude, 
      longitude: longitude) 
end 

ответ

1

Я не могу объяснить, почему на самом деле вы видите, что вы видите, я бы думал, что фактические результаты, которые вы бы видели бы, что только одна строка в БД была обновлена ​​в течение и с каждой строкой в ​​CSV.

Я также очень удивлен тем, что с этим puts $INPUT_LINE_NUMBER в вашем цикле вы не видели, чего бы я ожидал (один номер, напечатанный снова и снова).

Это происходит потому, что $INPUT_LINE_NUMBER не устанавливается автоматически в каждом each в Rails, это даже не устанавливается в File.read, так что в вашем коде, это будет все, что случилось, в конце последнего цикла IO.

Самый простой способ обойти это использовать индекс цикла в качестве идентификатора вместо того, чтобы использовать номер строки, поэтому вместо csv.each использование csv.each_with_index:

csv.each_with_index do |row, i| 
    postcode = row['postcode'] 
    latitude = row['latitude'] 
    longitude = row['longitude'] 

    Rental.update(i, postcode: postcode, latitude: latitude, 
      longitude: longitude) 
end 
+1

Благодаря @smathy, что обработанное – showFocus