【发布时间】:2012-10-04 23:50:30
【问题描述】:
我有一个评估模型。评价有很多分数。每当创建新的评估时,都会为需要评估的每个用户创建一个分数记录(请参阅下面我正在使用的当前方法。)因此,例如,可能一次创建 40 个分数记录。然后,评估所有者使用用户的分数更新每个分数记录。
我希望使用原始 SQL,因为每个插入都是自己的事务并且速度很慢。
我想使用原始 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
我没有提到当前方法被包装在一个事务中。
因此,本质上,我试图将其添加到代码块中,以便将所有内容都插入到一个语句中(** 此代码片段来自讨论该主题的 Chris Heald 的 Coffee Powered 网站。我会在那里提出问题,但帖子已超过 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(", ")}"
我很乐意展示我的一些尝试失败的代码...
再次感谢!
好吧,我拼凑了一些类似于上面代码的东西,但我在 ('evaluation_id' 部分周围出现 SQL 语句无效错误。有什么想法吗?
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
你知道上面的 SQL 代码是什么导致了错误吗?
【问题讨论】:
-
created_at 部分对我不起作用,因为它正在创建一个 postgres 无法解析的字符串。
ActiveRecord::StatementInvalid: PG::SyntaxError: ERROR: syntax error at or near "07" LINE 4: (1, 1, 100, 2017-02-20 07:00:56 +0000, 2017-02-20 07...
标签: ruby-on-rails ruby-on-rails-3