gpt4 book ai didi

mysql - Rails find_by 与 OR

转载 作者:行者123 更新时间:2023-11-29 08:51:44 25 4
gpt4 key购买 nike

我在 Rails 应用程序中设置了一个命名范围,用于通过 ID(直接来自索引 View )或 UUID(来自电子邮件 - 基本上只是这样用户无法输入)来定位记录任意ID并查看记录)

scope :by_uuid, lambda { |id| where('id = ? OR uuid = ?', id, id) }

这在显示操作中使用,因此 ID 来自 url,例如

services/114

services/74c083c0-8c29-012f-1c87-005056b42f8a

这非常有效,直到您获得诸如 74c083c0-8c29-012f-1c87-005056b42f8a 之类的 UUID不幸的是,rails 转换为 int 值,我们得到 services/74 以及具有正确 UUID 的记录

将 .first 添加到范围不会有任何帮助,因为每个记录的顺序可能不同,因此这不起作用。

有没有办法阻止rails像这样转换ID并按字面意思获取字符串?显然,不会有 ID 与之匹配的记录,但如果它随意传递给它的字符串的整数值,我们就可以获得任何结果。

使用动态查找器,例如

Service.find_by_uuid

Service.find_by_id

按预期工作,但是我们需要能够使用 UUID 或相同方法中的 ID 检索记录(显示)。

有没有办法做类似的事情

Service.find_by_id_or_uuid

最佳答案

我们通过对范围进行以下更改解决了此问题:

scope :by_uuid, lambda { |id| where('binary id = ? OR uuid = ?', id, id) }

这确保了 id 字符串由其二进制值获取,而不是转换为 int。但是,这仅适用于基于 MYSQL 的应用程序

关于mysql - Rails find_by 与 OR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10999405/

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