개요
이 가이드 에서는 Mongoid 모델에서 유효성 검사 규칙을 정의하는 방법을 학습 수 있습니다. 모델에 유효성 검사 구현 후에는 Mongoid가 유효성 검사 규칙을 위반하는 쓰기 (write) 작업을 실행 하지 못하도록 합니다. 문서 유효성 검사 사용하여 컬렉션에 있는 문서 필드의 데이터 유형과 값 범위를 제한합니다.
Mongoid에는 Active Record의 ActiveModel::Validations 가 포함되어 있어 관련 유효성 검사기 및 고유성 유효성 검사기를 포함한 유효성 검사 기능을 제공합니다. 자세한 학습 은 액티브 레코드 유효성 검사 Rails 가이드 및 ActiveModel::Validations Rails API 설명서를 참조하세요.
참고
Mongoid와 MongoDB 유효성 검사 비교
Mongoid의 유효성 검사는 애플리케이션 의 컨텍스트에만 적용되며 MongoDB 에서 스키마 유효성 검사 규칙을 생성하는 것과는 다릅니다. 즉, 애플리케이션 외부에서 수행되는 쓰기 (write) 작업에는 유효성 검사 규칙이 적용 않습니다. MongoDB 스키마 유효성 검사 에 대해 자세히 학습 서버 매뉴얼에서 스키마 유효성 검사 참조하세요.
유효성 검사 헬퍼
Mongoid는 모델 클래스를 정의할 때 사용할 수 있는 Active Record 유효성 검사 검사 헬퍼를 지원합니다. 이러한 헬퍼를 사용하여 필드 있는지 확인하거나, 필드 값을 지정된 값과 비교하거나, 필드 에 고유한 값이 있는지 확인하는 등 애플리케이션 에서 일반적인 유효성 검사 규칙을 설정하다 수 있습니다.
유효성 검사 규칙 정의
validates 매크로를 사용하여 유효성 검사 규칙을 만든 다음 유효성 검사 헬퍼와 규칙에 필요한 사양을 포함합니다.
팁
각 유효성 검사 헬퍼는 하나 이상의 필드 이름을 허용하므로 여러 필드에 대해 동일한 규칙을 정의할 수 있습니다.
다음 코드는 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_datequantity: 다음보다 작아야 합니다.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
팁
대체 헬퍼 메서드
Mongoid::Document 모듈은 특정 유효성 검사를 위한 매크로 메서드를 제공합니다. validates 매크로 성명서 에서 format 유효성 검사 헬퍼를 사용하는 대신 다음 코드에 표시된 대로 validates_format_of 메서드를 사용할 수 있습니다.
validates_format_of :username, with: /\A[a-zA-Z]+\z/
포함 또는 제외 규칙
inclusion 및 exclusion 헬퍼를 사용하여 필드 값이 지정된 값 목록에 있는지 여부에 따라 문서 유효성을 검사할 수 있습니다. in 옵션을 사용하여 값 목록을 지정합니다.
이 예시 shipping 필드 값이 허용되는 값 중 하나인지 확인하기 위해 Order 모델에 포함 유효성 유효성 검사 규칙을 정의합니다.
class Order include Mongoid::Document field :shipping, type: String validates :shipping, inclusion: { in: %w(standard priority overnight) } end
유무 규칙
presence 및 absence 헬퍼를 사용하여 필드 값이 있는지 여부(비어 있음)에 따라 문서 유효성을 검사할 수 있습니다.
이 예시 Order 모델에 대한 부재 유효성 검사 규칙을 정의하여 delivery_date 필드 값이 nil 또는 빈 문자열이 되도록 합니다.
class Order include Mongoid::Document field :delivery_date, type: String validates :delivery_date, absence: true end
팁
대체 헬퍼 메서드
Mongoid::Document 모듈은 특정 유효성 검사를 위한 매크로 메서드를 제공합니다. validates 매크로 성명서 에서 presence 유효성 검사 헬퍼를 사용하는 대신 다음 코드에 표시된 대로 validates_presence_of 메서드를 사용할 수 있습니다.
validates_presence_of :delivery_date
고유성 규칙
필드 값이 컬렉션 의 다른 값과 고유한지 여부에 따라 uniqueness 헬퍼를 사용하여 문서 유효성을 검사할 수 있습니다. scope 옵션을 사용하여 Mongoid가 고유성 검사를 제한하는 데 사용하는 필드 이름을 하나 이상 지정할 수 있습니다.
이 예시 first_name 필드 값이 동일한 last_name 값을 가진 문서 내에서 고유하도록 Person 모델에 대한 고유성 유효성 유효성 검사 규칙을 정의합니다.
class Person include Mongoid::Document field :first_name, type: String field :last_name, type: String validates :first_name, uniqueness: { scope: :last_name } end
팁
대체 헬퍼 메서드
Mongoid::Document 모듈은 특정 유효성 검사를 위한 매크로 메서드를 제공합니다. validates 매크로 성명서 에서 uniqueness 유효성 검사 헬퍼를 사용하는 대신 다음 코드에 표시된 대로 validates_uniqueness_of 메서드를 사용할 수 있습니다.
validates_uniqueness_of :first_name
Mongoid는 모델에서 validates_uniqueness_of 메서드를 사용할 때 primary 읽기 설정 (read preference) 사용하는데, 이는 복제본 세트 의 세컨더리 멤버를 쿼리하면 오래된 데이터를 읽을 수 있기 때문입니다.
이 메서드는 Mongoid가 고유성을 확인할 때 추가할 조건을 지정할 수 있는 conditions 옵션을 사용합니다.
validates_uniqueness_of :name, conditions: -> { where(:age.gte => 10) }
연관 관계 검증
You can use the validates_associated helper to validate any associations that your model has. When you include this validation rule, Mongoid validates any association documents any time you try to save an instance. To learn more about associations, see the Use Data Associations guide.
이 예시 포함된 Book 인스턴스에 대한 유효성 검사 검사 규칙을 실행 위해 Author 모델에 대한 연결 유효성 유효성 검사 규칙을 정의합니다.
class Author include Mongoid::Document embeds_many :books validates_associated :books end
중요
연관 관계의 양쪽 끝에 validates_associated 헬퍼를 사용하면 Mongoid가 무한 루프에서 유효성 검사를 수행하므로 사용하지 마세요.
사용자 지정 유효성 검사 규칙
validates_each 및 validates_with 헬퍼를 사용하여 사용자 지정 유효성 검사기를 만들 수 있습니다. 이러한 헬퍼에 대해 자세히 학습 예제를 보려면 액티브 레코드 문서에서 validates_each 및 validates_with 참조를 참조하세요.
사용자 지정 유효성 검사기에 대해 자세히 학습하려면 액티브 레코드 문서에서 사용자 지정 유효성 검사 수행하기 를 참조하세요.
행동
Mongoid는 문서 를 데이터베이스 에 유지하거나 저장할 때 유효성 검사 수행합니다. 다음 메서드는 유효성 검사 규칙을 트리거하다 Mongoid는 유효성 검사 통과한 경우에만 객체 데이터베이스 에 저장합니다.
createsaveupdate
앞의 메서드의 !접미사가 있는 버전을 사용할 때, 객체 에 대한 유효성 검사 실패하면 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?
Mongoid는 영구 데이터에서 valid? 를 실행 때 Active Record와 다르게 동작합니다. Active Record의 valid? 는 모든 유효성 검사를 실행하지만 Mongoid의 valid? 는 성능을 최적화하기 위해 메모리에 있는 문서에 대해서만 유효성 검사를 실행합니다.
추가 정보
Mongoid 모델에서 사용할 수 있는 필드 유형에 대해 자세히 학습 BSON 필드 유형 사용 가이드 참조하세요.
Mongoid의 유효성 검사 메서드 및 매크로에 대해 자세히 학습 API 문서에서 Mongoid::Validatable 모듈 참조를 참조하세요.
Active Record의 유효성 검사 헬퍼 전체 목록을 보려면 Rails API 문서에서 ActiveModel::Validations::HelperMethods 참조를 확인하세요.