Rails find_by with OR

时间:2012-06-12 15:04:31

标签: mysql ruby-on-rails-3 named-scope

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

1 个答案:

答案 0 :(得分:1)

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

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

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