这里有两个实体 - 设施和代理。每个设施belongs_to :agency
find_or_create没有通过第二个条件创建
我正在为读取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')
我写的SQL查询是有效的,事实上在该列上有一个唯一的约束(但我不认为Active Record知道这一点)。如果有多个但不能发生,SQL将会中断。有没有办法使用Active Record生成这个SQL,还是必须求助于两个查询? – Hut8