ドキュメントの検証
項目一覧
Overview
このガイドでは、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/
包含または除外ルール
inclusion
と exclusion
ヘルパーを使用すると、フィールド値が指定された値のリストに含まれているかどうかに基づいてドキュメントを検証できます。 値のリストを指定するには、in
オプションを使用します。
以下の例では、 Order
モデルに包含検証ルールを定義し、shipping
フィールド値が許容値のいずれかであることを確認します。
class Order include Mongoid::Document field :shipping, type: String validates :shipping, inclusion: { in: %w(standard priority overnight) } end
有無のルール
presence
と absence
ヘルパーを使用すると、フィールド値が存在するか存在しないか(空)に基づいてドキュメントを検証できます。
以下の例では、 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_each
と validates_with
ヘルパーを使用してカスタムバリデーターを作成できます。 これらのヘルパーとビューの例の詳細については、ActiveRecord ドキュメントの validate_each と validate_with 参照を参照してください。
カスタム バリデーターの詳細については、Active レコード ドキュメントの「 カスタム検証の実行 」を参照してください。
動作
Mongoid は、データベースにドキュメントを永続化するか保存するときに検証を実行します。 次のメソッドは検証ルールをトリガーします。これにより、Mongoid は検証に合格した場合にのみオブジェクトをデータベースに保存します。
create
save
update
前述のメソッドの !
接頭辞バージョンを使用すると、オブジェクトの検証が失敗した場合に Mongoid は Mongoid::Errors::Validations
例外を返します。
trigger 検証
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メソッド参照を参照してください。