我建议您使用 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
/ }