2016-05-18 99 views
2

下面的函數工作正常但是,如果任何記錄包含非UTF-8字符,則會給出500錯誤。如何在Ruby on Rails中創建批量操作事務

我可以在這裏使用事務進行批量操作,以便保存所有記錄或者不保存所有記錄嗎?

我已經嘗試使用各種編碼修復問題,如在stackoverflow中提到的,但這並不起作用。

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

這似乎是你問交易以及編碼問題。您應該一次嘗試提出一個問題。 –

+0

交易的主要動機是避免編碼錯誤。如果由於編碼部分記錄保存而出現任何問題,則會造成問題。直到現在我還沒有找到更好的編碼解決方案。 –

+0

這看起來像[XY問題](http://xyproblem.info/)。如果您遇到編碼錯誤和其他SO問題並未幫助您解決問題,則應發佈描述問題的問題,其中包括您收到的確切錯誤消息。 –

回答

1

您可以在交易中包裝您的create方法。如果任何INSERT失敗,整個操作將被回滾:

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

注意,爲了讓事務回滾一個ActiveRecord錯誤發生的查詢結果。因此,您必須在此處使用create!而不是create以確保爲無效數據拋出異常。

+0

感謝它的工作,但如何創建和創建!在這裏工作 –

+0

'create'將會運行,但自從'transaction'中的查詢開始運行後,它不會爲所有用戶回滾INSERTS。 –

相關問題