評価モデルがあります。評価には多くのスコアがあります。新しい評価が作成されるたびに、評価が必要なユーザーごとにスコアレコードが作成されます(これを行うために使用している現在の方法については、以下を参照してください)。たとえば、一度に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
これをどのように行うことができるかについて何か考えはありますか?ChrisHealdのCoffeePoweredサイトのコードサンプルを適応させてみましたが、サイコロはありません。
喜んで手伝ってくれる人に感謝します!
編集1
現在のメソッドがトランザクションにラップされていることについては言及しませんでした。
したがって、基本的に、これをコードブロックに追加して、すべてが1つのステートメントに挿入されるようにします(**このコードスニペットは、トピックについて説明したChrisHealdのCoffeePoweredサイトからのものです。そこで質問しますが、投稿は>です。 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コードの何がエラーを引き起こしているのかについて何か考えはありますか?