作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 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/
我是一名优秀的程序员,十分优秀!