1

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?

enter image description here

Antwort

1

Ihr Screenshot zeigt, dass Sie SQLite verwenden, aber die documentation sagt, dass diese Funktion nur für MySQL und PostgreSQL unterstützt wird. Sie müssen eine unterstützte Datenbank verwenden!


Meine erste Antwort, falls es in Zukunft jemand nützlich ist:

Das hängt On Duplicate Key Update Verhalten auf eine eindeutige Einschränkung für diese Spalten in der Datenbank selbst zu sein - denn du bist Wenn Sie doppelte Datensätze sehen, können Sie davon ausgehen, dass Sie keine solche Einschränkung haben.

Da die Datenbank keinen Konflikt in einer eindeutigen Integritätsbedingung meldet, gibt es keinen Grund, eine vorhandene Zeile zu aktualisieren! Die Antwort in this Stack Overflow question, "How to correctly do upsert in postgres 9.5" erklärt dies in etwas mehr Tiefe und zeigt die Art der Abfrage, die ausgegeben wird.

Sie sollten in der Lage sein, dies zu lösen, indem eine eindeutige Einschränkung oder Index für die VIN und Titelspalten hinzufügen, zum Beispiel einer Rails-Migration, die so etwas wie dies funktioniert:

class AddUniqueIndexToListingsOnVinAndTitle < ActiveRecord::Migration 
    def change 
    add_index :listings, [:vin, :title], unique: true 
    end 
end 

Einige weiteren Informationen finden Sie vielleicht nützlich (nicht sicher, ob Sie mit PostgreSQL oder MySQL):

+0

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. –

+0

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

+0

@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. –

Verwandte Themen