Docs Menu

ドキュメントの検証

このガイドでは、Mongoid モデルで検証ルールを定義する方法を学習できます。モデルに検証を実装すると、Mongoid は検証ルールに違反する書込み操作の実行中を防止します。 ドキュメント検証 を使用して、コレクション内のドキュメントフィールドのデータ型と値の範囲を制限します。

Mongoid には、関連する や 一意のバリデーターなどの検証機能を提供するために、ActiveRecord の ActiveModel::Validations が含まれています。 詳細については、 「アクティブ レコード検証ルール」 のガイドおよび 「ActiveModel::Validations Rails APIドキュメント」 を参照してください。

注意

Mongoid とMongoDB検証の比較

Mongoid の検証はアプリケーションのコンテキストでのみ適用され、 MongoDBでスキーマ検証ルールを作成することとは異なります。 つまり、 検証ルールは、アプリケーション外 で実行される書込み操作には適用されません。 MongoDBスキーマ検証の詳細については、サーバー マニュアルの「 スキーマバリデーション 」を参照してください。

Mongoid は、モデル クラスを定義するときに使用できる ActiveRecord 検証ヘルパーをサポートしています。 これらのヘルパーを使用して、フィールドの存在の確認、フィールド値を指定された値と比較する、フィールドに一意の値があることの確認など、アプリケーションに一般的な検証ルールを設定できます。

validates マイクロを使用して検証ルールを作成し、検証ヘルパーとルールに必要な仕様を含めます。

Tip

各検証ヘルパーは1 つ以上のフィールド名を受け入れるため、複数のフィールドに対して同じルールを定義できます。

次のコードは、presence 検証ヘルパーを使用して、Person インスタンスに nameフィールドの値が含まれていることを要求する方法を示しています。

class Person
include Mongoid::Document
field :name, type: String
validates :name, presence: true
end

このガイドの「 一般的な検証 」セクションでは、その他の便利な検証ヘルパーについて学習できます。

このセクションでは、次の一般的な検証ルールについて学習し、検証ヘルパーを使用する例を確認できます。

comparisonヘルパーを使用して、指定されたフィールドの値に基づいてドキュメントを検証できます。

comparisonヘルパーは次のオプションをサポートしています。

  • greater_than: 値は指定された値より大きくなければなりません。

  • greater_than_or_equal_to: 値は指定された値以上である必要があります。

  • equal_to: 値は指定された値と等しくなっている必要があります。

  • less_than: 値は指定された値より小さくなければなりません。

  • less_than_or_equal_to: 値は指定された値以下である必要があります。

  • other_than: 値は指定された値と異なる必要があります。

この例では、 Order モデルに対して次の比較検証ルールを定義します。

  • delivery_date: order_date の値の後に( より大きい)必要があります

  • quantity: 5 未満である必要があります

class Order
include Mongoid::Document
field :order_date, type: DateTime
field :delivery_date, type: DateTime
field :quantity, type: Integer
validates :delivery_date, comparison: { greater_than: :order_date }
validates :quantity, comparison: { less_than: 5 }
end

formatヘルパーを使用すると、フィールド値が 正規式と一致するかどうかに基づいてドキュメントを検証できます。 正規式 を指定するには、with オプションを使用します。

この例では、 User モデルに形式検証ルールを定義して、usernameフィールドに文字のみが含まれていることを確認します。

class User
include Mongoid::Document
field :username, type: String
validates :username, format: { with: /\A[a-zA-Z]+\z/ }
end

Tip

代替ヘルパー メソッド

Mongoid::Document モジュールは、特定の検証のためのマイクロ メソッドを提供します。 validates マイクロ ステートメントで format 検証ヘルパーを使用する代わりに、次のコードに示すように validates_format_of メソッドを使用できます。

validates_format_of :username, with: /\A[a-zA-Z]+\z/

inclusionexclusion ヘルパーを使用すると、フィールド値が指定された値のリストに含まれているかどうかに基づいてドキュメントを検証できます。 値のリストを指定するには、in オプションを使用します。

以下の例では、 Order モデルに包含検証ルールを定義し、shippingフィールド値が許容値のいずれかであることを確認します。

class Order
include Mongoid::Document
field :shipping, type: String
validates :shipping, inclusion: { in: %w(standard priority overnight) }
end

presenceabsence ヘルパーを使用すると、フィールド値が存在するか存在しないか(空)に基づいてドキュメントを検証できます。

以下の例では、 Order モデルに空白検証ルールを定義し、delivery_dateフィールド値が nil または空の string であることを確認します。

class Order
include Mongoid::Document
field :delivery_date, type: String
validates :delivery_date, absence: true
end

Tip

代替ヘルパー メソッド

Mongoid::Document モジュールは、特定の検証のためのマイクロ メソッドを提供します。 validates マイクロ ステートメントで presence 検証ヘルパーを使用する代わりに、次のコードに示すように validates_presence_of メソッドを使用できます。

validates_presence_of :delivery_date

uniquenessヘルパーを使用すると、フィールド値がコレクション内の他の値と一意であるかどうかに基づいてドキュメントを検証できます。 scope オプションを使用して、Mongoid が使用する 1 つ以上のフィールド名を指定して、一意性チェックを制限できます。

この例では、 Person モデルに一意性検証ルールを定義し、first_nameフィールドの値が同じ last_name 値を持つドキュメント内で一意であることを確認します。

class Person
include Mongoid::Document
field :first_name, type: String
field :last_name, type: String
validates :first_name, uniqueness: { scope: :last_name }
end

Tip

代替ヘルパー メソッド

Mongoid::Document モジュールは、特定の検証のためのマイクロ メソッドを提供します。 validates マイクロ ステートメントで uniqueness 検証ヘルパーを使用する代わりに、次のコードに示すように validates_uniqueness_of メソッドを使用できます。

validates_uniqueness_of :first_name

モデルで validates_uniqueness_of メソッドを使用する場合、Mongoid は primary読み込み設定 (read preference)を使用します。これは、レプリカセットの セカンダリ ノードをクエリすると、古いデータが読み取られる可能性があるためです。

このメソッドでは、Mongoid が一意性をチェックするときに追加する条件を指定できる conditions オプションが使われます。

validates_uniqueness_of :name, conditions: -> { where(:age.gte => 10) }

validates_associatedヘルパーを使用して、モデルが持っている関連付けを検証できます。 この検証ルールを含めると、インスタンスを保存しようとするたびに、Mongoid はすべての関連付けドキュメントを検証します。 関連付けについて詳しくは、「 関連付けガイド 」を参照してください。

この例では、埋め込まれた Book インスタンスの検証ルールを実行するために、Author モデルに 関連付け検証ルール を定義します。

class Author
include Mongoid::Document
embeds_many :books
validates_associated :books
end

重要

関連付けの両方の端で validates_associatedヘルパーを使用しないでください。これにより、Mongoid が無限ループで検証を実行するようになります。

validates_eachvalidates_with ヘルパーを使用してカスタムバリデーターを作成できます。 これらのヘルパーとビューの例の詳細については、ActiveRecord ドキュメントの validate_each validate_with 参照を参照してください。

カスタム バリデーターの詳細については、Active レコード ドキュメントの「 カスタム検証の実行 」を参照してください。

Mongoid は、データベースにドキュメントを永続化するか保存するときに検証を実行します。 次のメソッドは検証ルールをトリガーします。これにより、Mongoid は検証に合格した場合にのみオブジェクトをデータベースに保存します。

  • create

  • save

  • update

前述のメソッドの ! 接頭辞バージョンを使用すると、オブジェクトの検証が失敗した場合に Mongoid は Mongoid::Errors::Validations 例外を返します。

valid? メソッドを使用して、検証を手動で実行できます。 このメソッドは、オブジェクトが検証に合格した場合は true を返し、そうでない場合は false を返します。

class Person
include Mongoid::Document
field :name, type: String
field :age, type: Integer
validates :age, comparison: { greater_than_or_equal_to: 0 }
end
# Returns true
Person.new(name: "Berta Odom", age: 4).valid?
# Returns false
Person.new(name: "Cody Peng", age: -5).valid?

永続化データで valid?を実行中場合、Mongoid は ActiveRecord とは動作が異なります。 ActiveRecord の valid? はすべての検証を実行しますが、Mongoid の valid? はパフォーマンスを最適化するためにメモリにあるドキュメントに対してのみ検証を実行します。

Mongoid モデルで使用できるフィールド型の詳細については、「 フィールド型ガイド 」を参照してください。

Mongoid の検証メソッドとマイクロの詳細については、 APIドキュメントの Mongoid::Validable モジュール参照を参照してください。

Active レコードで検証ヘルパーの完全なリストを表示するには、Rails APIドキュメントの ActiveModel::Validation::Helperメソッド参照を参照してください。