首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带OR的Rails find_by

问带OR的Rails find_by
EN

Stack Overflow用户
提问于 2012-06-12 23:04:31
回答 1查看 620关注 0票数 0

我在我的rails应用程序中设置了一个命名作用域,用于通过记录的ID (直接从索引视图)或UUID (从电子邮件-基本上只是为了让用户不能输入任何ID和查看记录)来定位记录。

代码语言:javascript
复制
scope :by_uuid, lambda { |id| where('id = ? OR uuid = ?', id, id) }

这是在show操作中使用的,因此ID来自url,例如

代码语言:javascript
复制
services/114

services/74c083c0-8c29-012f-1c87-005056b42f8a

这非常有效,直到您获得一个UUID,例如74c083c0-8c29-012f-1c87-005056b42f8a这,rails不幸地转换为int值,我们得到了services/74以及具有正确UUID的记录

向作用域添加.first没有任何帮助,因为每条记录的顺序可能不同,因此这是不起作用的。

有没有办法防止rails像这样转换ID并从字面上获取字符串?显然,不会有ID与之匹配的记录,但如果它随意地与传递给它的字符串的整数值匹配,我们就可以得到任何东西。

使用动态查找器,例如

代码语言:javascript
复制
Service.find_by_uuid

或

代码语言:javascript
复制
Service.find_by_id

按预期工作,但是我们需要能够在相同的方法(show)中使用UUID或ID检索记录。

有没有办法做像这样的事情

代码语言:javascript
复制
Service.find_by_id_or_uuid
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-13 21:34:33

我们通过对作用域进行以下更改修复了此问题:

代码语言:javascript
复制
scope :by_uuid, lambda { |id| where('binary id = ? OR uuid = ?', id, id) }

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10999405

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档