1

这里有两个实体——设施和机构。各设施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')
4

1 回答 1

0

您尝试做的事情是不可能的,因为没有满足您条件的唯一机构 ID。(SELECT 'agency_id' FROM 'agencies' WHERE 'code' = 'ROFL')返回一个记录数组,其长度可能是也可能不是 1。

总之,这不是框架的限制。它只是无法从您编写的代码中确定 Agency_id 应该是什么。

于 2013-05-17T18:43:04.047 回答