gpt4 book ai didi

mysql - 如何生成 ActiveRecord 查询

转载 作者:行者123 更新时间:2023-11-29 06:50:26 25 4
gpt4 key购买 nike

我有一个关于 ActiveRecord 查询的问题:为这样的查询编写 AR 的最佳方式是什么:

SELECT .* FROM `professionals` 
LEFT OUTER JOIN `networks`
ON `networks`.`userable_id` = `professionals`.`id`
AND `networks`.`userable_type` = 'Professional'
WHERE (`networks`.`insurer_id` IS NULL OR (`networks`.`insurer_id` != 1))

我遇到的最大麻烦是查询中的这部分:

WHERE (`networks`.`insurer_id` IS NULL OR (`networks`.`insurer_id` != 1))

我可以使用以下命令生成上述查询:

professionals.left_joins(:networks)
.where(networks: { insurer_id: nil })
.or(
professionals.left_joins(:networks)
.where.not(networks: { insurer_id: @insurer&.id }))

这非常难闻,因为它看起来好像我在第一个查询中重复了部分查询。有没有办法让我写得更好?

在 Rails 中使用 WHERE NOT 和链接 OR 查询时,我遇到了很多麻烦。所以当它们最终同时存在时,我真的很不走运。

编辑>>>>>>>>没有 NULL 条件似乎会忽略 LEFT JOIN 的其他项目...

[4] pry(main)> Professional.left_joins(:networks).where.not(networks: {insurer_id: 1}).count
(0.4ms) SELECT COUNT(*) FROM `professionals` LEFT OUTER JOIN `networks` ON `networks`.`userable_id` = `professionals`.`id` AND `networks`.`userable_type` = 'Professional' WHERE (`networks`.`insurer_id` != 1)
=> 0

最佳答案

您能做的最好的事情就是在切换到 AR 之前重构您的 SQL:

SELECT .* FROM `professionals` 
LEFT OUTER JOIN `networks`
ON `networks`.`userable_id` = `professionals`.`id`
AND `networks`.`userable_type` = 'Professional'
WHERE (`networks`.`insurer_id` IS NULL OR (`networks`.`insurer_id` != 1))

如果保险公司 ID 不为 1,那么 NULL 是有效值吗?我会这么说。你应该能够替换

(`networks`.`insurer_id` IS NULL OR (`networks`.`insurer_id` != 1))

`networks`.`insurer_id` != 1

这给我们留下了

SELECT .* FROM `professionals` 
LEFT OUTER JOIN `networks`
ON `networks`.`userable_id` = `professionals`.`id`
AND `networks`.`userable_type` = 'Professional'
WHERE `networks`.`insurer_id` != 1

使用 AR 进行查询应该会容易得多。

关于mysql - 如何生成 ActiveRecord 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47722555/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com