필드 동작 사용자 지정
개요
이 가이드 에서는 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는 i n gem18 를 사용하여 현지화된 필드를 지원합니다. 필드 현지화하면 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!" }
참고
현지화된 필드에 대해 광범위하게 쿼리 하려는 경우 쿼리 하려는 각 국가 및 언어 설정 인덱싱 것이 좋습니다.