Rails 7.1: Active Modelバリデーションの:in
・:within
オプションでbeginless/endless rangeをサポート(翻訳)
Rails 7.1で、Active Modelバリデーションで:in
オプションや:within
オプションを使う場合に、いわゆるbeginless/endlessのrangeをサポートするようになりました。
既に、以下のようにbeginlessやendlessのrangeを使うクエリは(Rails 7.0の)Active Recordで利用可能です。
Book.where(purchases: 20..)
# `purchases`が20件以上あるレコードのコレクションを返す
Book.where(purchases: ..20)
# `purchase`が20件以下のレコードのコレクションを返す
しかしActive Modelのバリデーションで同様のbeginless/endlessのrangeを使おうとすると、利用範囲が限られていました。
Rails 7.1では、Active Modelバリデーションでbeginless/endlessのrangeをサポートする形で利用範囲を拡張しています。たとえば、あるUser
のfirst_name
の長さを上限指定なしでバリデーションする場合は、以下のようにin: 20..
でシンプルに書けます。
class User
# ...
validates_length_of :first_name, in: 20..
end
上の:first_name
の長さ指定には上限がないので、長さが20以上である限り有効です。
:within
オプションでも上の例と同じことができます。
class User
# ...
validates_length_of :first_name, within: 20..
end
同様に、Active Recordバリデーションで:inclusion
オプションを併用した場合を見てみましょう。
class User
# ...
validates :age, inclusion: { in: proc { (25..) } }
end
この例では、レコードが有効であるためには:age
フィールドの値が25以上である必要があります。
詳しくは以下のプルリクをご覧ください。
- Support infinite ranges for
LengthValidator
s:in
/:within
options by fatkodima · Pull Request #45138 · rails/rails - Add beginless range support to clusivity by bjeanes · Pull Request #45123 · rails/rails
関連記事
Rails 7.1: config.active_storage.serviceが未設定の場合にRuntimeErrorで通知(翻訳)
The post Rails 7.1: Active Modelバリデーションのin・withinオプションでbeginless/endless rangeをサポート(翻訳) first appeared on TechRacho.
概要
元サイトの許諾を得て翻訳・公開いたします。
日本語タイトルは内容に即したものにしました。
参考: 週刊Railsウォッチ20220531: バリデーションの
in
やwithin
でbeginless/endless rangeをサポート参考: Edge API
ActiveModel::Validations::Length
— private参考: Edge API
ActiveModel::Validations::Clusivity
— private参考: Clusivity – Wikipedia