我会建议你使用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的更多信息。
但是,如果你真的想用正则表达式来限制高达BIGINT限制(9223372036854775807
)的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
这正则表达式是由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
/}
你为什么要使用正则表达式?你完全知道限制,所以只需检查参数是否低于限制。 – Shadow
您会如何在路线指令中表达这样的条件? – Boris