下面的函數工作正常但是,如果任何記錄包含非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
這似乎是你問交易以及編碼問題。您應該一次嘗試提出一個問題。 –
交易的主要動機是避免編碼錯誤。如果由於編碼部分記錄保存而出現任何問題,則會造成問題。直到現在我還沒有找到更好的編碼解決方案。 –
這看起來像[XY問題](http://xyproblem.info/)。如果您遇到編碼錯誤和其他SO問題並未幫助您解決問題,則應發佈描述問題的問題,其中包括您收到的確切錯誤消息。 –