这里有两个实体——设施和机构。各设施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 子句中的第二个条件没有传递:
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')