我必须在Rails中一次向数据库添加25000条记录。 我也必须验证它们。
以下是我现在所拥有的:
# controller create action
def create
emails = params[:emails][:list].split("\r\n")
@created_count = 0
@rejected_count = 0
inserts = []
emails.each do |email|
@email = Email.new(:email => email)
if @email.valid?
@created_count += 1
inserts.push "('#{email}', '#{Date.today}', '#{Date.today}')"
else
@rejected_count += 1
end
end
return if emails.empty?
sql = "INSERT INTO `emails` (`email`, `updated_at`, `created_at`) VALUES #{inserts.join(", ")}"
Email.connection.execute(sql) unless inserts.empty?
redirect_to new_email_path, :notice => "Successfuly created #{@created_count} emails, rejected #{@rejected_count}"
end
现在非常慢,无法添加此类记录的超时原因。
有什么想法吗?我正在使用mysql。
答案 0 :(得分:2)
我想到了三件事:
之后,您需要重新考虑这部分应用程序的流程。如果您在create
等控制器操作中使用后台处理,则不能只返回HTTP 201
或HTTP 200
。您需要做的是返回“快速”HTTP 202 Accepted
,并提供指向另一个表示的链接,用户可以检查其请求的状态(我们是否已经成功响应?有多少封电子邮件失败?),因为它现在正在后台处理。
它听起来有点复杂,这是一个标志,你可能不应该这样做。为什么你必须在一个请求中添加25000条记录?什么是backgorund?
答案 1 :(得分:0)
为什么不为工作创建rake任务?以下链接很好地解释了它。
http://www.ultrasaurus.com/sarahblog/2009/12/creating-a-custom-rake-task/
简而言之,一旦你编写了rake任务,就可以通过以下方式开始工作:
rake member:load_emails
答案 2 :(得分:0)
如果您关注速度,我会从另一个角度解决问题。
emails
表结构的表格;让它为emails_copy
。不要复制索引和约束。emails_copy
创建索引和约束以模仿emails
表。违规行为(如有)将浮出水面;解决它们。insert into emails select * from emails_copy
将电子邮件放入生产表。好吧,您可以使用它来获得正确的自动增量ID。drop table emails_copy
。