Railsに結合テーブルがあります。これはIDを持つ2列のテーブルです。
このテーブルに大量に挿入するために、私は
ActiveRecord::Base.connection.execute("INSERT INTO myjointable (first_id,second_id) VALUES #{values})
残念ながら、重複があるとエラーが発生します。insert
値を更新する必要はありません。重複が存在する場合は、次の値に進んでください。
どうすればいいですか?
fyiとして、私はstackoverflowを検索しましたが、ほとんどの答えは私が理解できるように少し進んでいます。また、postgresqlのドキュメントを確認し、Railsコンソールで遊んでみましたが、それでも役に立ちませんでした。私はこれを理解できないので、他の誰かが私が間違っていることを教えてくれることを願っています。
私が試した最も近いステートメントは次のとおりです。
INSERT INTO myjointable (first_id,second_id) SELECT 1,2
WHERE NOT EXISTS (
SELECT first_id FROM myjointable
WHERE first_id = 1 AND second_id IN (...))
このステートメントの問題の一部は、一度に1つの値しか挿入しないのに対し、一括挿入するステートメントが必要なことです。また、second_id IN (...)
ステートメントのセクションには最大100の異なる値を含めることができるため、それがどれほど遅くなるかはわかりません。
ほとんどの場合、重複は多くないはずなので、一時テーブルに一括挿入して個別の値を見つけることが良い考えかどうかはわかりません。
編集してコンテキストを追加します。
一括挿入が必要な理由は、2つのモデル間に多対多の関係があり、モデルの1つにフォームが入力されないためです。株と株価の履歴があります。株価履歴はフォームで作成されることはなく、yahooFinanceAPIを使用してYahooFinanceからデータを取得することで大量に挿入されます。activerecord-import gemを使用して株価履歴(つまり、Model.import列、値)を一括挿入しますが、jointable.import列、値を入力できません。jointable is an undefined local variable