【问题标题】:find_or_create doesn't pass second condition to createfind_or_create 没有通过第二个条件来创建
【发布时间】:2013-05-17 18:27:58
【问题描述】:

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

【问题讨论】:

    标签: sql ruby-on-rails ruby-on-rails-3 activerecord


    【解决方案1】:

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

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

    【讨论】:

    • 我写的我正在寻找的 SQL 是有效的,实际上该列上有一个唯一的约束(但我认为 Active Record 不知道这一点)。如果有多个 SQL,SQL 将中断,但这不会发生。有没有办法使用 Active Record 生成这个 SQL,还是我必须求助于两个查询?
    猜你喜欢
    • 2020-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-26
    • 2018-09-14
    • 2018-04-18
    • 2012-01-17
    相关资源
    最近更新 更多