2013-05-17 18 views
1

这里有两个实体 - 设施和代理。每个设施belongs_to :agencyfind_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') 

回答

0

你想要做的事情是不可能的,因为没有唯一的agency_id满足你的条件。 (SELECT 'agency_id' FROM 'agencies' WHERE 'code' = 'ROFL')返回一组记录,其长度可能是或不是1.

总之,这不是框架的限制。它只是不能确定你写的代码应该是什么agency_id。

+0

我写的SQL查询是有效的,事实上在该列上有一个唯一的约束(但我不认为Active Record知道这一点)。如果有多个但不能发生,SQL将会中断。有没有办法使用Active Record生成这个SQL,还是必须求助于两个查询? – Hut8