我會建議你使用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