我在rails中编写了一个rake任务,用gender
值更新我的用户数据库。它应该做的就是遍历我的用户并使用我从性别检测中获得的值更新性别属性"宝石(运作良好)。
rake任务现在运行几分钟,尽管我的数据库中只有几十条记录:
require 'gender_detector'
namespace :user do
desc 'Assign gender to all users'
task :genderize => :environment do
User.all.each do |user|
gd = GenderDetector.new(:case_sensitive => false)
gender = gd.get_gender(user.firstname)
sql = "UPDATE users SET gender = '#{gender}' WHERE id = #{user.id}"
ActiveRecord::Base.connection.execute(sql)
end
end
end
我做错了什么?
答案 0 :(得分:2)
rake任务中有几个组件:rails boot,database,genderdetector等。您应该隔离每个组件并对其进行基准测试,以了解瓶颈是什么。
根据您拥有的宝石数量,Rails环境可能需要几秒钟到一分钟才能预订。因此,:environment
要求可能会降低您的任务速度。
我不知道GenderDetector
做了什么以及它如何在内部工作。例如,如果它查询Web服务,IO也可能会降低您的任务速度。
最后,您还可以优化查询,以避免从数据库中加载不必要的数据。
require 'gender_detector'
namespace :user do
desc 'Assign gender to all users'
task :genderize => :environment do
User.select('id, firstname').each do |user|
gd = GenderDetector.new(:case_sensitive => false)
gender = gd.get_gender(user.firstname)
User.update_all({ gender: gender }, user_id: user.id)
end
end
end
答案 1 :(得分:-1)
因为要更新每个用户,所以对数据库使用单独的查询。