gpt4 book ai didi

ruby-on-rails - 如何在 Ruby on Rails 中创建批量操作事务

转载 作者:太空宇宙 更新时间:2023-11-03 16:19:15 24 4
gpt4 key购买 nike

下面的函数工作正常,但是如果任何记录包含非 UTF-8 字符,它会给出 500 错误。

我可以在此处使用事务进行批量操作,以便保存所有记录或不保存任何记录吗?

我已尝试使用 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

最佳答案

您可以将您的create 方法包装在事务中。如果任何 INSERT 失败,整个操作将被回滚:

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

请注意,为了回滚事务,ActiveRecord 错误必须作为查询的结果发生。因此,您必须在此处使用 create! 而不是 create 以确保为无效数据抛出异常。

关于ruby-on-rails - 如何在 Ruby on Rails 中创建批量操作事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37291771/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com