gpt4 book ai didi

mysql - 将 Rails 路由中的参数限制为 INT(11) 范围

转载 作者:行者123 更新时间:2023-11-30 22:32:25 25 4
gpt4 key购买 nike

问题:当 API 客户端向我的 Rails 4.2.4 应用程序发送参数超过最大值 2147483647 的请求时,我不断收到此类异常:

RangeError: 1446629302683 is out of range for ActiveRecord::Type::Integer with limit 4

数据库是MySQL,列的数值类型是INT(11),所以想直接在路由中限制接受参数的范围,例如

get 'movies/:id(.:format)' => 'movies#show', constraints: { id: /.../ }

如何在这里定义 4 个字节的范围作为 Regex 表达式?或者有更聪明的方法吗?

最佳答案

我建议您使用 8 字节整数 (bigint) 而不是 4 字节整数,而不是限制路由中的 id。

在您的迁移文件中使用(limit: 8 选项)以这种方式声明它:

add_column :movies, :id, :integer, limit: 8

这会给你的 id 一个上限 9223372036854775807 其中 4 字节整数的限制是 2147483647

有关 bigint in Rails migrations, and what :limit means for column migrations 的更多信息,请参阅此帖子.

但是,如果您真的想使用正则表达式将 id 限制为 bigint 限制(9223372036854775807),那么这里是正则表达式:

\b([1-9][0-9]{0,17}|[1-8][0-9]{18}|9([01][0-9]{17}|2([01][0-9]{16}|2([0-2][0-9]{15}|3([0-2][0-9]{14}|3([0-6][0-9]{13}|7([01][0-9]{12}|20([0-2][0-9]{10}|3([0-5][0-9]{9}|6([0-7][0-9]{8}|8([0-4][0-9]{7}|5([0-3][0-9]{6}|4([0-6][0-9]{5}|7([0-6][0-9]{4}|7([0-4][0-9]{3}|5([0-7][0-9]{2}|80[0-7]))))))))))))))))\b

此正则表达式由 Utility Mill 生成我在 rubular 上测试了它.

因此,使用上面的正则表达式,您的路线变为:

get 'movies/:id(.:format)' => 'movies#show', constraints: { id: /\b([1-9][0-9]{0,17}|[1-8][0-9]{18}|9([01][0-9]{17}|2([01][0-9]{16}|2([0-2][0-9]{15}|3([0-2][0-9]{14}|3([0-6][0-9]{13}|7([01][0-9]{12}|20([0-2][0-9]{10}|3([0-5][0-9]{9}|6([0-7][0-9]{8}|8([0-4][0-9]{7}|5([0-3][0-9]{6}|4([0-6][0-9]{5}|7([0-6][0-9]{4}|7([0-4][0-9]{3}|5([0-7][0-9]{2}|80[0-7]))))))))))))))))\b
/ }

关于mysql - 将 Rails 路由中的参数限制为 INT(11) 范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33520333/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com