我在我的 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