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

Rails 7: 数値バリデーションを範囲(..)で指定できるinオプションが追加(翻訳)

概要

原著者の許諾を得て翻訳・公開いたします。

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

以下の関連記事もどうぞ。

訂正(2023/06/05)

jnchitoさんからのご指摘を受け、#41022が正式に反映されたのが7-0-stableブランチ(Rails 7.0.0.alpha1以降)からであることを確認し、タイトルを修正しました。ありがとうございます!

Rails 7: 数値バリデーションを範囲(..)で指定できるinオプションが追加(翻訳)

numericalityバリデーションヘルパーは、特定の範囲に収まるべき数値をバリデーションするための:greater_than_or_equal_to:less_than_or_equal_to、あるいは :greater_than:less_thanといったオプションを提供しています。オプション名を見ればどのようなバリデーションを期待しているかがすぐわかるので、理解がはかどります。

でも、コードのシンプルさも表現力も損なわずに入力量を節約できる方法があれば素晴らしいと思いませんか?

最近のRailsの更新ではこの点が改善され、バリデーションしたい値の範囲を指定できる in: オプションが使えるようになりました(#41022)。

Rubyでは、以下のような範囲指定を日常的に用います。

range = (1..5)
range.each { |n| puts n }        # => 1, 2, 3, 4, 5

たとえば、プロフィールの詳細に入力するユーザーの年齢を18〜65歳の間で入力してもらいたいとします。

変更前

従来だと以下のような書き方になったでしょう。

class User < ApplicationRecord
  validates :age, numericality: { greater_than_or_equal_to: 18, less_than_or_equal_to: 65 }
end

変更後

in:オプションを使うことで、同じことを以下のように書けるようになりました。

class User < ApplicationRecord
  validates :age, numericality: { in: 18..65 }
end

ageの値が1865の範囲に収まらないUserを追加しようとすると、以下のようになります。

User.create!(name: "Chris", age: 14)

# => ActiveRecord::RecordInvalid (Validation failed: Age must be greater than or equal to 18)

関連記事

Rails 7: 関連付けのあるレコードを取れる’associated’クエリメソッドが追加(翻訳)

Rails 6.1: whereの関連付けでjoinedテーブルのエイリアス名を参照可能になった(翻訳)


CONTACT

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