Rails 7: Ruby 2.7の"beginless range"がサポートされる(翻訳)
Ruby 2.7で"beginless range"がサポートされるようになったことで、Rails 7でもActrive Recordのinclusion
バリデータやexclusion
バリデータで..42
のような"beginless range"がサポートされるようになります。
改修前
Rails 6以前は、たとえばProductモデルで価格を5000以内にする必要がある箇所にバリデーションを追加しようとすると、以下のような書き方をする必要がありました。
class Product < ApplicationRecord
validates_inclusion_of :price, in: 0..5000
end
また、beginless rangeを使おうとすると以下のようなエラーが発生します。
=> Product.create(title: "Detergent", description: "A mixture of surfactants with cleansing properties", price: 4000)
/Users/.rvm/gems/ruby-3.0.2/gems/activemodel-7.0.3/lib/active_model/validations/clusivity.rb:45:in `first': cannot get the first element of beginless range (RangeError)
エラーメッセージにcannot get the first element of beginless range
と表示されていることがわかります。
改修後
Rails 7では、以下のようにbeginless rangeを追加できるようになります。
class Product < ApplicationRecord
validates_inclusion_of :price, in: ..5000
end
=> Product.create(title: "Detergent", description: "A mixture of surfactants with cleansing properties", price: 4000)
=> TRANSACTION (7.5ms) BEGIN
Product Create (5.0ms) INSERT INTO "products" ("name", "description", "created_at", "updated_at", "price") VALUES ($1, $2, $3, $4, $5) RETURNING "id" [["name", "Detergent"], ["description", "A mixture of surfactants with cleansing properties"], ["created_at", "2022-08-10 20:10:06.227125"], ["updated_at", "2022-08-10 20:10:06.227125"], ["price", 4000]]
TRANSACTION (2.5ms) COMMIT
詳しくは#45123をご覧ください。
概要
元サイトの許諾を得て翻訳・公開いたします。
日本語タイトルは内容に即したものにしました。
#45123のbeginless rangeはActive Modelに追加されました。現時点の#45123はmainブランチにのみマージされており、7-0-stableブランチにはマージされていません。