Docs Menu

필드 동작 사용자 지정

이 가이드 에서는 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

기본값 으로 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 예외를 발생시킵니다.

참고

bitinc와 같은 원자성 지속성 연산자에 대한 호출은 읽기 전용 필드 에 대한 변경 사항을 계속 유지합니다.

전체 모델을 읽기 전용으로 지정하는 방법을 학습 데이터 작업 수행 가이드 의 읽기 전용 문서 섹션을 참조하세요.

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!" }

참고

현지화된 필드에 대해 광범위하게 쿼리 하려는 경우 쿼리 하려는 각 국가 및 언어 설정 인덱싱 것이 좋습니다.