ich aktiv-Rekord Import Juwel in einer Klassenmethode verwenden Array von Anzeigen von CSV-Datei lesen zu importieren, wie unten im Code gezeigt:aktiver Datensatz-Import schafft doppelten Datensätze
def self.import_listings(file)
start = Time.now
count = 0
valid_listings = Array.new
CSV.foreach(file.path, headers: true, encoding:'iso-8859-1:utf-8') do |row|
data = {}
row.to_hash.each do |k, v|
key = MAP[k]
data[key] = v
end
unless data[:vin] == nil
listing = Listing.new
listing.title = "#{data[:year]} #{data[:make]} #{data[:model]}"
listing.approved = true
unless data[:all_images] == nil
listing_images = data[:all_images].split(",")
i = 0
[:image, :imagefront, :imageback, :imageleft, :imageright, :frontinterior, :rearinterior].each do |image|
unless listing_images.size < 1
data[image] = CsvUploading::picture_from_url(listing_images[i])
i += 1
end
end
end
data.delete(:all_images)
data[:approved] = true
listing.attributes = data
valid_listings << listing
end
end
begin
Listing.import valid_listings, on_duplicate_key_update: { conflict_target: [:title, :vin], columns: [user_id: :user_id, newused: :newused]}# , :stocknumber, :model, :year, :trim, :miles, :enginedescription,:cylinder,:fuel,:transmission, :price, :color, :interiorcolor, :options, :description, :image, :image, :imagefront, :imageback, :imageleft, :imageright, :frontinterior, :rearinterior]
rescue
p "some issue"
end
finish = Time.now
puts diff = finish - start
end
Wie pro aktiv Rekord Import-Dokumentation, ich versuche, einen Beobachter auf den Titel und VIN Felder der Auflistung als konfliktbehaftete Ziele zu setzen. Im Falle eines Konflikts von VIN Feld eines Eintrags, ich möchte ein Update statt erstellen.
Aber im Moment erstellt es jedes Mal, wenn ich einen CSV-Upload ausführe, einen neuen Eintrag aus Listing.import und überprüfe nicht, ob der Konflikt besteht.
Wohin gehe ich falsch?
ist, was ich zu denken (ich war zu dieser Frage einige der Forschung, wie Sie Ihre Antwort gepostet). In meinem Test wird durch den Import ein "PG :: InvalidColumnReference" ausgelöst: ERROR: Es gibt keine Eindeutigkeits- oder Ausschlusseinschränkung, die der ON CONFLICT-Spezifikation entspricht, wenn Sie keinen eindeutigen Index für die Konfliktzielspalte haben. Ich konnte die doppelten Datensätze deshalb nicht reproduzieren. –
Guter Fang @DerekHopper! Es wäre gut, mehr über das Setup zu wissen (Ich frage mich, ob es eine Datenbank ist, die das Upserting nicht unterstützt?) @SauravPrakash Welche Datenbank verwenden Sie und gibt es Einschränkungen oder Indizes für die Listing-Tabelle? – jpn
@jpn: Hinzufügen eines eindeutigen Index hilft, aber jetzt bekomme ich eine 'ConstraintException: UNIQUE Constraint fehlgeschlagen' Fehler für doppelte Datensätze. Das zeigt an, dass es ein Duplikat ist, aber on_duplicate_key_update funktioniert immer noch nicht und aktualisiert die Daten nicht. –