问题:当API客户端将参数超过最大值2147483647的请求发送到我的Rails 4.2.4 app时,我不断遇到这种异常:
RangeError:1446629302683超出范围 ActiveRecord :: Type :: Integer,限制为4
数据库是MySQL,列的数字类型是INT(11),所以我想在路径中直接限制接受参数的范围,例如
get 'movies/:id(.:format)' => 'movies#show', constraints: { id: /.../ }
如何在此处将4字节的范围定义为Regex表达式?或者有更聪明的方法吗?
答案 0 :(得分:0)
我建议您使用 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
/ }