我有一个评估模型.评价有很多分数.每当创建新的评估时,都会为需要评估的每个用户创建分数记录(请参阅下文,了解我正在使用的当前方法).例如,可以立即创建40个分数记录.评估所有者随后用用户的得分更新每个分数记录.
我正在寻找使用原始sql,因为每个插入是自己的事务,并且缓慢.
def build_evaluation_score_items self.job.active_employees.each do |employee| employee_score = self.scores.build employee_score.user_id = employee.id employee_score.save end end
关于如何做到这一点的任何想法?我试过调整Chris Heald的Coffee Powered网站的代码示例,但是没有骰子.
感谢任何人愿意帮助!
编辑1
我忽略了当前的方法被包裹在一个事务中.
所以,本质上,我试图添加到代码块,所以所有的东西都插入一个语句(**这个代码snippit是从Chris Heald的咖啡供稿网站讨论的主题,我会问那里的问题,但是这个帖子是> ; 3岁)):
inserts = [] TIMES.times do inserts.push "(3.0,'2009-01-23 20:21:13',2,1)" end sql = "INSERT INTO user_node_scores (`score`,`updated_at`,`node_id`,`user_id`)VALUES #{inserts.join(",")}"
再次感谢!
嗯,我已经拼凑了一些类似于上面的代码,但是我得到一个sql语句(‘evaluation_id’部分的无效错误.任何想法?
def build_evaluation_score_items inserts = [] self.job.active_employees.each do |employee| inserts.push "(#{self.id},#{employee.id},#{Time.now},#{Time.now})" end sql = "INSERT INTO scores ('evaluation_id',`user_id`,'created_at',`updated_at`)VALUES #{inserts.join(",")}" ActiveRecord::Base.connection.execute(sql) end
解决方法
那么经过很多的试验和错误,这里是最后的答案.很酷的是所有的记录都是通过一个语句插入的.当然,跳过验证(所以如果您在创建时需要模型验证),但是在我的情况下,这并不是必需的,因为我正在做的是为每个员工的评估设置分数记录.当然,当工作领导更新员工的评估分数时,验证工作正常.
def build_evaluation_score_items inserts = [] time = Time.now.to_s(:db) self.job.active_employees.each do |employee| inserts.push "(#{self.id},'#{time}')" end sql = "INSERT INTO scores (evaluation_id,user_id,created_at) VALUES #{inserts.join(",")}" ActiveRecord::Base.connection.execute(sql) end