我正在尝试将200k记录插入三个不同的表中。当我解析CSV文件并尝试插入这些记录时,Ruby会锁定整个系统。这是我的代码:
def upload_country
@upload = Upload.new(:upload => params[:upload])
if @upload.save
csv = CSV.parse(csv_text, :headers => true)
csv.each_with_index do |row, index|
unless row["name"].blank? or row["country_code"].blank? or row["destination"].blank? or row["code"].blank?
@country = Country.new(:name => row["name"].gsub(/\s+/, " ").strip, :country_code => row["country_code"].gsub(/\s+/, " ").strip, :user_id => current_user.id, :subscriber_id => get_subscriber_id)
@country.save
if row["country_code"] == "1"
p = @country.country_code.to_s+@destination.name+row["code"].gsub(/\s+/, " ").strip
else
p = @country.country_code.to_s+row["code"].gsub(/\s+/, " ").strip
end
@code = DestinationCode.create(:code => p, :country_destination_id => 1, :user_id => current_user.id)
end
end
@upload.destroy
@countries = Country.find_all_by_subscriber_id(get_subscriber_id)
render :partial => '/mycarriers/carrier_country', :layout => false
end
答案 0 :(得分:1)
如果您有长时间运行的请求,则意味着如果您只有一个rails实例正在运行,那么当时没有其他用户可以访问您的应用程序。
我建议您使用delayed_job gem
在后台执行长处理任务。在控制器端,您应该将作业和response 202 (Accepted)
排入浏览器。在客户端,您应该定期将请求发送到服务器,无论作业是否已完成。然后,相应地更新ui。
以slideshare.net为例。当用户完成上传后,slideshare会重定向到新页面,并在转换演示文件时定期更新ui。
另一种解决方案是您可以在后台运行rake脚本。从railscasts中查看this episode。
答案 1 :(得分:0)