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

时间:2015-11-04 11:11:51

标签: mysql ruby-on-rails regex ruby-on-rails-4

问题:当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表达式?或者有更聪明的方法吗?

1 个答案:

答案 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
/ }