ここには、施設と機関の 2 つのエンティティがあります。各施設belongs_to :agency
CSV ファイルを読み取ってデータを解析するデータベースのシード スクリプトを作成しています。
これにより、名前と所属する機関とともに施設が追加されます。
Facility.joins(:agency)
.where(name: row[:name], agencies: { code: agency_code })
.first_or_create
.where(name: row[:name], agencies: { code: agency_code })
までの部分がまさに私が望むことを行うことを確認しました:
SELECT `facilities`.* FROM `facilities`
INNER JOIN `agencies` ON `agencies`.`id` = `facilities`.`agency_id`
WHERE `facilities`.`name` = 'Awesomesauce factory'
AND `agencies`.`code` = 'ROFL'
ご覧のとおり、代理店の ID をハードコーディングしていないため、結合が必要でありROFL
、この場合はどれがどれであるかを知る必要があります。
代理店は既に挿入されているため、コード の代理店が既に存在しますROFL
。私の問題は、作成ステップ中に、WHERE 句の 2 番目の条件が渡されないことです。
INSERT INTO `facilities` (`agency_id`, `created_at`, `name`, `updated_at`)
VALUES (NULL, '2013-05-17 18:16:53', 'Awesomesauce Factory','2013-05-17 18:16:53')
最初の値が NULL であることがわかりますか? それは私が修正したいものです。現在、実際には、その代理店コードを持つ代理店のクエリを実行して手動で設定するコード ブロックを渡していますが、サブクエリを使用してハックしなくても機能するようです。私が生成したいのは次のとおりです。
INSERT INTO `facilities` (`agency_id`, `created_at`, `name`, `updated_at`)
VALUES (
(SELECT `agency_id` FROM `agencies` WHERE `code` = 'ROFL'),
'2013-05-17 18:16:53', 'Awesomesauce Factory','2013-05-17 18:16:53')