我在我的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值,我们得到了services/74以及具有正确UUID的记录
向作用域添加.first没有任何帮助,因为每条记录的顺序可能不同,因此这是不起作用的。
有没有办法防止rails像这样转换ID并从字面上获取字符串?显然,不会有ID与之匹配的记录,但如果它随意地与传递给它的字符串的整数值匹配,我们就可以得到任何东西。
使用动态查找器,例如
Service.find_by_uuid或
Service.find_by_id按预期工作,但是我们需要能够在相同的方法(show)中使用UUID或ID检索记录。
有没有办法做像这样的事情
Service.find_by_id_or_uuid发布于 2012-06-13 21:34:33
我们通过对作用域进行以下更改修复了此问题:
scope :by_uuid, lambda { |id| where('binary id = ? OR uuid = ?', id, id) }这确保了id字符串是通过它的二进制值获取的,而不是被转换为int。然而,这将仅适用于基于MYSQL的应用程序。
https://stackoverflow.com/questions/10999405
复制相似问题