2016-05-18 7 views
2

Die folgende Funktion funktioniert gut aber Wenn ein Datensatz nicht UTF-8-Zeichen enthalten, gibt es 500 Fehler.Wie erstellt man eine Massenoperation Transaktionen in Ruby on Rails

Kann ich die Transaktion hier für den Massenbetrieb verwenden, so dass entweder alle Datensätze gespeichert werden oder keiner von ihnen?

Ich habe versucht, mit verschiedenen Codierung beheben Problem wie auf Stackoverflow erwähnt, aber das funktioniert nicht.

def convert_save(model_name, csv_data, field_name=nil) 
     target_model = model_name.classify.constantize 
     csv_file = csv_data.read 
     row_headers={} 
     counter=0; 
     all_recs=[]; 
     #Thread.new do 
       CSV.parse(csv_file) do |row| 
        if counter==0 
         temp=row 
         row_headers = Hash[temp.map.with_index.to_a] 
         counter +=1 
         next 
        end 
         #start fetch row and put into active record object 
         unless row[row_headers["name"]].nil? 
          temp={} 
          temp_time={} 
          for name in [:business_type_id, :user_id, :name, :country_id, :latitude, :longitude, :free_shipping] 
           temp[name] = row[row_headers[name.to_s]] 
          end 
          for name in [:homepage, :telephone, :email, :address, :facebook, :twitter, :google, :instagram, :pinterest, :ship_details] 
           temp[name] = row[row_headers[name.to_s]] ||= "" 
          end 
          for name in [:category_ids, :style_ids, :filter_ids, :shipping_country_ids] 
           temp[name] = row[row_headers[name.to_s]].try(:split, ",") unless row_headers[name.to_s].nil? 
          end 
          for name in [:monday, :tuesday, :wednesday, :thursday, :friday, :saturday, :sunday, :public_holiday] 
           temp_time[name.to_s] = row[row_headers[name.to_s]] ||= "" 
          end 
          temp_time["appointment_only"] = row[row_headers["appointment_only"]] 
          temp["business_timing_attributes"] = temp_time 
          all_recs.push(temp) 
         end 
       end 
       Business.create(all_recs) 
       ActiveRecord::Base.connection.close 
     end 
    #end 
    end 
+0

Es scheint, als ob Sie Fragen über Transaktionen sowie ein Codierungsproblem stellen. Sie sollten versuchen, jeweils eine Frage zu stellen. –

+0

Das Hauptmotiv der Transaktion besteht darin, einen Codierungsfehler zu vermeiden. Wenn irgendein Problem auftritt, um den partiellen Datensatz zu speichern, um ein Problem zu erzeugen. Ich habe bis jetzt keine bessere Lösung für die Kodierung gefunden. –

+0

Dies scheint wie ein [XY-Problem] (http://xyproblem.info/). Wenn Sie Codierungsfehler bekommen und andere SO-Fragen Ihnen nicht geholfen haben, sollten Sie eine Frage stellen, die das Problem beschreibt, einschließlich der genauen Fehlermeldungen, die Sie erhalten. –

Antwort

1

Sie können Ihre create Methode in eine Transaktion einbinden. Falls ein INSERT fehlschlägt, wird der gesamte Vorgang rückgängig gemacht:

Business.transaction do 
    Business.create!(all_recs) 
end 

Beachten Sie, dass für eine Transaktion, um einen Active Fehler wird zurückgerollt wird als Ergebnis der Abfrage auftreten. Daher müssen Sie create! anstelle von create hier verwenden, um sicherzustellen, dass eine Ausnahme für ungültige Daten ausgelöst wird.

+0

danke es funktioniert aber wie schaffen und erstellen! Arbeit hier –

+0

'create' wird ausgeführt, aber es wird keine INSERTS für alle Benutzer Rollback, da die Abfrage innerhalb von 'transaction' gestartet wurde. –