我在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
这很有效,直到你得到一个UUID,如74c083c0-8c29-012f-1c87-005056b42f8a 不幸的是,rails转换为int值,我们得到服务/ 74 AS WELL AS具有正确的UUID
在作用域中添加.first将无济于事,因为每个记录的顺序可能不同,因此不起作用。
有没有办法阻止rails像这样转换ID并按字面意思取字符串?显然,不存在具有与之匹配的ID的记录,但是如果它与传递给它的字符串的整数值无关紧要,我们可以得到任何回报。
使用动态查找器,例如
Service.find_by_uuid
或
Service.find_by_id
按预期工作,但我们需要能够使用相同方法(显示)中的UUID或ID来检索记录。
有没有办法做类似
的事情Service.find_by_id_or_uuid
答案 0 :(得分:1)
我们通过对范围进行以下更改来解决此问题:
scope :by_uuid, lambda { |id| where('binary id = ? OR uuid = ?', id, id) }
这可确保id字符串由其二进制值获取,而不是转换为int。但是,这将仅适用于基于MYSQL的应用程序