개요
이 가이드 에서는 Mongoid 모델의 필드 동작을 사용자 지정하는 방법을 학습 수 있습니다.
기본값 지정
default 옵션을 사용하여 필드가 기본값 을 갖도록 구성할 수 있습니다. 기본 필드 값은 고정 또는 Proc 값일 수 있습니다.
다음 예시 state 필드 에 고정된 기본값 을 지정합니다.
class Order include Mongoid::Document field :state, type: String, default: 'created' end
다음 예시 fulfill_by 필드 에 Proc 기본값 을 지정합니다.
class Order include Mongoid::Document field :fulfill_by, type: Time, default: ->{ Time.now + 3.days } end
참고
운전자 클래스가 로드될 때 인스턴스가 아닌 기본값 을 Proc 평가합니다. 운전자 Proc 문서 인스턴스화될 때 값을 평가합니다. 다음 기본값 필드 값은 동일한 결과를 생성하지 않습니다.
# Time.now is set to the time the class is loaded field :submitted_at, type: Time, default: Time.now # Time.now is set to the time the document is instantiated field :submitted_at, type: Time, default: ->{ Time.now }
Proc 인스턴스 에서 self 키워드를 사용하여 문서 상태 에 따라 달라지는 기본값 을 설정하다 수 있습니다. 다음 예시 submitted_at 필드 의 상태 에 따라 fulfill_by 기본값 을 설정합니다.
field :fulfill_by, type: Time, default: ->{ self.submitted_at + 4.hours }
기본값 으로 Mongoid는 다른 모든 속성을 설정하고 초기화한 후 Proc 기본값 을 적용합니다. 다른 속성을 설정하기 전에 기본값 적용 하려면 다음 예시 와 같이 pre_processed 옵션을 true로 설정하다 .
field :fulfill_by, type: Time, default: ->{ Time.now + 3.days }, pre_processed: true
팁
_id 필드 에 기본값 Proc 값을 설정하다 하려면 항상 pre-processed 옵션을 true 로 설정하다 .
스토리지 이름 지정
애플리케이션 에서 원래 이름으로 필드 참조하면서 데이터베이스 에 저장 별도의 필드 이름을 지정할 수 있습니다. MongoDB 모든 문서 와 함께 모든 필드 정보를 저장하기 때문에 저장 공간을 절약할 수 있습니다.
as: 키워드를 사용하여 대체 저장 이름을 설정하다 수 있습니다. 다음 예시 Mongoid가 데이터베이스 에 n(으)로 저장하는 name(이)라는 필드 생성합니다.
class Band include Mongoid::Document field :n, as: :name, type: String end
Mongoid는 name 필드 "n"(으)로 저장하지만 애플리케이션 에서 name(으)로 필드 계속 액세스 할 수 있습니다.
필드 별칭
alias_attribute 옵션을 사용하여 필드 의 별칭을 만들 수 있습니다. 별칭을 지정해도 Mongoid가 데이터베이스 에 필드 저장하는 방법은 변경되지 않지만, 애플리케이션 에서 다른 이름으로 필드 액세스 할 수 있습니다.
다음 예시 name 필드 의 별칭을 지정합니다.
class Band include Mongoid::Document field :name, type: String alias_attribute :n, :name end
필드 별칭을 제거 하려면 unalias_attribute 옵션을 사용할 수 있습니다. 다음 예시 name 필드 의 별칭을 제거합니다.
class Band unalias_attribute :n end
unalias_attribute 를 사용하여 _id 필드 에서 사전 정의된 id 별칭을 제거 수도 있습니다. 이를 사용하여 _id 필드 와 id 필드 에 서로 다른 값을 저장 수 있습니다.
필드 재정의
기본값 으로 Mongoid를 사용하면 모델의 필드를 재정의할 수 있습니다. 필드 재정의할 때 오류를 발생시키려면 mongoid.yml 파일 에서 duplicate_fields_exception 구성 옵션을 true로 설정하다 .
duplicate_fields_exception 옵션이 true로 설정하다 경우에도 필드 정의할 때 overwrite 옵션을 true 로 설정하여 특정 필드 재정의할 수 있습니다. 다음 예시 name 필드 정의한 다음 overwrite 옵션을 사용하여 필드 재정의합니다.
class Person include Mongoid::Document field :name field :name, type: String, overwrite: true end
사용자 지정 ID 필드
기본값 으로 Mongoid는 Mongoid가 자동으로 생성하는 BSON::ObjectId 값을 포함하도록 문서의 _id 필드 정의합니다. 유형을 사용자 지정하거나 모델에 지정하여 _id 필드 의 기본값 을 지정할 수 있습니다.
다음 예시 사용자 지정 _id 필드 있는 Band 클래스를 만듭니다.
class Band include Mongoid::Document field :name, type: String field :_id, type: String, default: ->{ name } end
_id 필드 의 기본값 을 생략할 수 있습니다. 필드 에 기본값 을 지정하지 않으면 Mongoid는 _id 값 없이 문서 를 유지합니다. 최상위 문서의 경우 MongoDB 서버 _id 값을 자동으로 할당합니다. 그러나 내장된 문서의 경우 서버 _id 값을 할당하지 않습니다.
_id 필드 에 값을 지정하지 않으면 Mongoid는 서버 에서 자동으로 할당된 값을 조회 하지 않습니다. 이로 인해 _id 값을 사용하여 데이터베이스 에서 문서 조회 할 수 없습니다.
캐스팅 불가 값
지정된 필드 유형으로 변환할 수 없는 값은 캐스팅할 수 없는 것으로 간주됩니다. 예시 를 들어 배열 Integer 필드 에 할당될 때 캐스팅할 수 없는 것으로 간주됩니다.
v8.0 이상에서 Mongoid는 캐스팅할 수 없는 값에 nil 를 할당합니다. 캐스팅할 수 없는 원래 값은 필드 이름과 함께 attributes_before_type_cast 해시에 저장됩니다.
사용자 정의 게터 및 세터
필드 와 동일한 이름의 메서드를 지정하고 read_attribute 또는 write_attribute 메서드를 호출하여 원시 속성 값에 대해 작업을 수행하여 필드 의 기본값 getter 및 setter 메서드를 재정의할 수 있습니다.
다음 예시 Person 클래스의 name 필드 에 대한 사용자 지정 getter 및 setter를 만듭니다.
class Person include Mongoid::Document field :name, type: String # Custom getter for 'name' to return the name in uppercase def name read_attribute(:name).upcase if read_attribute(:name) end # Custom setter for 'name' to store the name in lowercase def name=(value) write_attribute(:name, value.downcase) end end
읽기 전용 속성
attr_readonly 옵션을 지정하여 필드 읽기 전용으로 지정할 수 있습니다. 이렇게 하면 속성이 있는 문서를 만들 수 있지만 업데이트 는 없습니다.
다음 예시 Band 클래스를 만들고 name 필드 읽기 전용으로 지정합니다.
class Band include Mongoid::Document field :name, type: String field :origin, type: String attr_readonly :name end
update_attributes와(과) 같은 대량 업데이트 메서드를 호출하고 읽기 전용 필드 전달하면 Mongoid는 읽기 전용 필드 무시하고 다른 필드를 모두 업데이트합니다. 읽기 전용 필드 명시적으로 업데이트 하려고 하면 Mongoid가 ReadonlyAttribute 예외를 발생시킵니다.
참고
bit 및 inc와 같은 원자성 지속성 연산자에 대한 호출은 읽기 전용 필드 에 대한 변경 사항을 계속 유지합니다.
전체 모델을 읽기 전용으로 지정하는 방법을 학습 데이터 작업 수행 가이드 의 읽기 전용 문서 섹션을 참조하세요.
필드 현지화
Mongoid는 i18n gem를 사용하여 현지화된 필드를 지원합니다. 필드 현지화하면 Mongoid가 해당 필드 국가 및 언어 설정 설정 키 및 값의 해시로 저장합니다. 필드에 액세스하는 것은 문자열 값과 동일한 방식으로 작동합니다. 모든 필드 유형의 필드를 현지화할 수 있습니다.
다음 예시 현지화된 review 필드 있는 Product 클래스를 만듭니다.
class Product include Mongoid::Document field :review, type: String, localize: true end I18n.default_locale = :en product = Product.new product.review = "Marvelous!" I18n.locale = :de product.review = "Fantastisch!" product.attributes # Outputs: { "review" => { "en" => "Marvelous!", "de" => "Fantastisch!" }
_translations 메서드를 호출하여 모든 번역을 한 번에 가져오고 설정하다 수 있습니다.
product.review_translations # Outputs: { "en" => "Marvelous!", "de" => "Fantastisch!" } product.review_translations = { "en" => "Marvelous!", "de" => "Wunderbar!" }
i18n 폴백 기능 활성화하여 현지화된 필드에 대한 폴백을 지정할 수 있습니다.
사용자 환경에서 config.i18n.fallbacks 구성 설정과 폴백 언어를 설정하여 Rails 애플리케이션 에서 폴백을 활성화합니다.
config.i18n.fallbacks = true config.after_initialize do I18n.fallbacks[:de] = [ :en, :es ] end
모듈을 i18n 백엔드 에 포함하고 폴백 언어를 설정하여 Rails가 아닌 애플리케이션에서 폴백을 활성화합니다.
require "i18n/backend/fallbacks" I18n::Backend::Simple.send(:include, I18n::Backend::Fallbacks) I18n.fallbacks[:de] = [ :en, :es ]
대체를 활성화한 후 활성 언어 번역이 없는 경우 지정된 대체 언어 로 조회됩니다.
필드 정의할 때 fallbacks 옵션을 false로 설정하여 지정된 필드 에 대한 대체 언어를 비활성화할 수 있습니다.
class Product include Mongoid::Document field :review, type: String, localize: true, fallbacks: false end
현지화된 필드를 쿼리할 때 Mongoid는 현재 국가 및 언어 설정 과 일치하도록 쿼리 기준을 자동으로 변경합니다. 다음 예시 Product 클래스에 en 국가 및 언어 설정 의 검토 쿼리합니다.
# Match all products with Marvelous as the review. The current locale is :en. Product.where(review: "Marvelous!") # The resulting MongoDB query filter: { "review.en" : "Marvelous!" }
참고
현지화된 필드에 대해 광범위하게 쿼리 하려는 경우 쿼리 하려는 각 국가 및 언어 설정 인덱싱 것이 좋습니다.