0
我在我的Rails应用程序中设置了一个命名范围,该范围用于通过其ID(直接来自索引视图)或UUID(来自电子邮件 - 基本上只是为了让用户可以“T在任何输入ID和浏览记录)Rails find_by with OR
scope :by_uuid, lambda { |id| where('id = ? OR uuid = ?', id, id) }
这在表演动作用,所以ID来自网址,例如
services/114
services/74c083c0-8c29-012f-1c87-005056b42f8a
这个伟大的工程,直到你得到一个UUID如74c083c0-8c29-012f-1c87-005056b42f8a 这样,不幸的是,转换为int值为a nd我们得到的服务/ 74以及正确的UUID记录
向范围添加一个.first将无济于事,因为每个记录的顺序可能不同,因此不起作用。
有没有办法来防止轨道转换这样的ID和字面上的字符串?很显然,不会有一个ID与之相匹配的记录,但如果它传递给它的字符串的整数值不变,我们可以返回任何东西。
使用动态查找,如按预期
Service.find_by_uuid
或
Service.find_by_id
工作,但是我们需要能够使用UUID或同一方法ID检索记录(显示)。
有没有办法做这样的事情
Service.find_by_id_or_uuid
您最初的想法使用带有lambda函数的命名范围应该工作。你确定你在代码中没有错误吗?它似乎应该是作用域:by_uuid,lambda {where('id =?或uuid =?',id,uuid)} - 您的问题中的参数化查询中有两个参数。 –
是的,因为id是来自URL字符串 - 所以我们可以有服务/ 114或服务/ 74c083c0-8c29-012f-1c87-005056b42f8a,它需要对两者作出响应,实际上我忽略了| id |宣言。我编辑了上面的帖子来澄清。问题在于它获取UUID字符串的int值并拉起服务/ 74而不是正确的记录。 – Oranges13