Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連

Rails 7: Ruby 2.7の”beginless range”がサポートされる(翻訳)

概要

元サイトの許諾を得て翻訳・公開いたします。

日本語タイトルは内容に即したものにしました。

#45123のbeginless rangeはActive Modelに追加されました。現時点の#45123mainブランチにのみマージされており、7-0-stableブランチにはマージされていません。

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をご覧ください。

関連記事

Rails 7: insert_allとupsert_allで属性のエイリアスを指定可能になる(翻訳)


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。