0

我在我的 Rails 应用程序中设置了一个命名范围,用于通过其 ID(直接来自索引视图)或 UUID(来自电子邮件 - 基本上只是为了让用户无法输入任何 ID 和查看记录)

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

这是在 show 动作中使用的,所以 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
4

1 回答 1

2

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

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

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

于 2012-06-13T13:34:33.470 回答