我们必须从一个表中获取大约5百万条记录,然后将它们插入到具有相同表结构的另一个表中。
我们正在使用Sidekiq和redis将记录插入队列并从队列中插入。
这是我的代码:
User_controller
:
def reinsert_users
@active_users = ExportUser.all
RecreateUserWorker.perform_async(@active_users)
end
recreateuser_worker.rb
:
class RecreateUserWorker
include Sidekiq::Worker
def perform(users)
begin
@user = User.new("true")
@user.recreate(users)
rescue
raise
end
end
end
'' '''
User.rb :
def recreate(users)
users.each do |user|
@user = ExportUsersV2.new(user) # new table to insert
@user.save
end
end
这是我得到的错误:
WARN: {"class"=>"RecreateUserWorker", "args"=>["#<ExportUser::ActiveRecord_Relation:0xa3781b0>"], "retry"=>true, "queue"=>"default", "jid"=>"25fe4378de1bb967ff4d1e5e", "enqueued_at"=>1438605202.8414373, "error_message"=>"undefined method `each' for \"#<ExportUser::ActiveRecord_Relation:0xa3781b0>\":String", "error_class"=>"NoMethodError", "failed_at"=>1438605202.8470101, "retry_count"=>0}
我在这里缺少什么?
答案 0 :(得分:1)
您传入的是复杂的Ruby对象,这是不允许的。
https://github.com/mperham/sidekiq/wiki/Best-Practices#1-make-your-job-parameters-small-and-simple
答案 1 :(得分:0)
我认为最好使用直接mysql查询在批量中插入用户。
您可以使用gem https://github.com/tauqeer-ahmad/bulk_uploadable/tree/master或任何其他宝石。
我认为这可以解决这个问题。