2016-04-09 14 views
0

Ich habe den folgenden Code, der jede Zeile in meinem Rental-Modell mit den Attributen aus jeder Zeile der CSV-Datei aktualisieren soll. Die Zeile mit einer ID von 1 in der Datenbank sollte ihre Attribute mit den Werten von Zeile 1 in der CSV usw. aktualisiert haben. Ich habe 10000 Zeilen in der Tabelle und 10000 Zeilen (ohne Kopfzeile) in CSV.Spalten aus einer CSV aktualisieren

jedoch statt die Attribute im Modell zu aktualisieren, wo id = Zeile alles Zeile aktualisiert mit der ersten Zeile der CSV in der Tabelle Attribute, dann die zweiten etc ...

Jede mögliche Hilfe würde geschätzt!

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 

Antwort

1

Ich kann nicht wirklich erklären, warum Sie sehen, was Sie sehen, würde ich die tatsächlichen Ergebnisse gedacht haben Sie wäre gesehen hätte, dass nur eine Zeile in der DB wurde aktualisiert über und vorbei mit jeder Zeile in der CSV.

Ich bin auch sehr überrascht, dass mit dieser puts $INPUT_LINE_NUMBER in Ihrer Schleife, die Sie nicht gesehen haben, was ich erwarten würde (eine einzelne Zahl immer und immer wieder gedruckt).

Dies liegt daran, $INPUT_LINE_NUMBER nicht automatisch in jedem each in Rails gesetzt ist, ist es nicht einmal durch einen File.read gesetzt, so in Ihrem Code wird es sein, was es am Ende des letzten IO Schleife sein passiert ist.

Der einfachste Weg, um dies ist den Schleifenindex als Ihre ID zu verwenden, anstatt zu versuchen, die Zeilennummer, so dass anstelle von csv.each Verwendung csv.each_with_index zu verwenden:

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

Dank @smathy Das hat funktioniert – showFocus

Verwandte Themen