Docs Menu
Docs Home
/ / /
몽고이드
/

연관 관계

이 페이지의 내용

  • 개요
  • 참조된 연관 관계
  • Has One
  • Has Many
  • Belongs To
  • Has and Belongs To Many
  • 참조된 연관 관계 쿼리
  • 내장된 연관 관계
  • Embeds One
  • Embeds Many
  • 재귀적 임베딩
  • 임베디드 연관 관계 쿼리
  • _id 필드 생략
  • 포함된 연관 관계 삭제
  • 연결 동작 사용자 지정
  • 확장 프로그램
  • 사용자 정의 연관 관계 이름
  • 사용자 지정 키
  • 사용자 정의 범위
  • 유효성 검사
  • 다형성
  • 종속 행동
  • 참조된 연관 관계 자동 저장
  • 자동 빌드
  • 접촉
  • 카운터 캐시
  • 연관 관계 메타데이터
  • 속성

Mongoid의 연관 관계를 사용하면 모델 간의 관계를 생성할 수 있습니다. 이 가이드 에서는 Mongoid가 지원하는 다양한 유형의 연결과 이를 애플리케이션 에서 사용하는 방법에 대해 학습 수 있습니다.

참조된 연관 관계를 사용하면 한 모델이 다른 모델을 참조하는 두 모델 간의 관계 만들 수 있습니다. Mongoid는 다음과 같은 참조 연관 관계 유형을 지원합니다:

  • has_one

  • has_many

  • belongs_to

  • has_and_belongs_to_many

다음 섹션에서는 이러한 각 연결 유형을 사용하는 방법에 대해 설명합니다.

has_one 매크로를 사용하여 한 클래스가 나타내는 문서에 별도의 하위 클래스가 나타내는 문서 도 포함되도록 선언할 수 있습니다. 다음 예시 Studio 클래스에 대해 has_one 관계 가진 Band 클래스를 만듭니다.

class Band
include Mongoid::Document
has_one :studio
end

has_one 연관 관계를 선언할 때, 자식 클래스는 반드시 부모 클래스를 참조하는 belongs_to 연관 관계를 사용해야 합니다. 다음 예시 이전 Band 클래스에서 참조된 Studio 클래스를 보여줍니다.

class Studio
include Mongoid::Document
belongs_to :band
end

매크로에 대해 자세히 학습 소속 섹션을 belongs_to 참조하세요.

다음 예시 와 같이 유효성 검사를 사용하여 자식 클래스가 부모 클래스에 있는지 확인할 수 있습니다.

class Band
include Mongoid::Document
has_one :studio
validates_presence_of :studio
end

Mongoid의 유효성 검사에 대해 자세히 학습 유효성 검사 가이드 참조하세요.

has_many 매크로를 사용하여 클래스가 나타내는 문서에 다른 클래스가 나타내는 하위 문서가 여러 개 포함되어 있음을 선언할 수 있습니다. 다음 예시 Members 클래스에 대해 has_many 관계 가진 Band 클래스를 만듭니다.

class Band
include Mongoid::Document
has_many :members
end

has_many 연관 관계를 선언할 때, 자식 클래스는 반드시 부모 클래스를 참조하는 belongs_to 연관 관계를 사용해야 합니다. 다음 예시 이전 Band 클래스에서 참조된 Member 클래스를 보여줍니다.

class Member
include Mongoid::Document
belongs_to :band
end

매크로에 대해 자세히 학습 belongs_to Belongs To 섹션을 참조하세요.

다음 예시 와 같이 유효성 검사를 사용하여 자식 클래스가 부모 클래스에 있는지 확인할 수 있습니다.

class Band
include Mongoid::Document
has_many :members
validates_presence_of :members
end

Mongoid의 유효성 검사에 대해 자세히 학습 유효성 검사 가이드 참조하세요.

데이터베이스 에서 전체 문서 설정하다 를 검색하지 않고도 has_many 연관 관계에 any? 메서드를 사용하여 연관 관계에 문서가 포함되어 있는지 확인할 수 있습니다.

다음 예시 any? 메서드를 사용하여 Band 클래스의 문서에 Members 문서가 포함되어 있는지 확인합니다.

band = Band.first
band.members.any?

다음 예시 와 같이 필터하다 와 함께 any? 메서드를 사용하여 지정된 기준과 일치하는 문서를 찾을 수도 있습니다.

band = Band.first
band.members.any? { |member| member.instrument == 'piano' }

any? 메서드에 클래스 이름을 제공하여 클래스 이름으로 결과를 필터하다 수 있습니다. 이는 다형성 연관 관계에 유용합니다.

class Drummer < Member
end
band = Band.first
band.members.any?(Drummer)

참고

연결된 클래스의 데이터가 Mongoid에 로드된 후에는 any? 메서드에 대한 후속 호출에서 데이터베이스 쿼리 하지 않습니다. 대신 Mongoid는 메모리에 이미 로드된 데이터를 사용합니다.

exists? 메서드를 호출하여 연결에 영구 문서가 있는지 확인할 수도 있습니다. exists? 메서드는 항상 데이터베이스 쿼리하고 데이터베이스 에 저장된 문서만 확인합니다. exists? 메서드는 필터링을 허용하지 않으며 인수를 허용하지 않습니다.

다음 예시 exists? 메서드를 사용하여 Band 클래스에 지속형 Members 문서가 있는지 확인합니다.

band = Band.create!
# Member is not persisted.
band.members.build
band.members.exists?
# Outputs: false
# Persist the member
band.members.map(&:save!)
band.members.exists?
# Outputs: true

한 클래스가 나타내는 문서 다른 클래스가 나타내는 문서 의 하위 문서임을 선언하려면 belongs_to 매크로를 사용합니다. 기본값 으로 상위 클래스의 _id 필드 하위 클래스에 저장됩니다. 다음 예시 Band 클래스에 대한 belongs_to 연관 관계가 있는 Members 클래스를 생성합니다.

class Members
include Mongoid::Document
belongs_to :band
end

다음 예시 와 같이 optional 옵션을 true로 설정하여 Mongoid가 연결된 상위 클래스의 _id 를 저장하지 않고도 데이터베이스 에 문서를 유지하도록 할 수 있습니다.

class Members
include Mongoid::Document
belongs_to :band, optional: true
end

애플리케이션의 구성 설정에서 belongs_to_required_by_default 구성 옵션을 false 로 설정하여 상위 클래스가 필요하지 않도록 belongs_to 연관 관계의 기본값 동작을 전역적으로 변경할 수 있습니다.

상위 클래스에서 일치하는 has_one 또는 has_many 연결을 지정하지 않고도 하위 클래스에서 belongs_to 연결을 지정할 수 있습니다. 이렇게 하면 상위 클래스에서 하위 문서 의 필드에 액세스 할 수 없지만 상위 클래스의 _id 필드 와 같이 하위 클래스에 저장된 상위 필드에는 액세스 할 수 있습니다. 다음 예시 에서 Band 클래스는 Members 클래스에 액세스 할 수 없지만 Members 클래스는 Band 클래스에 액세스 할 수 있습니다.

class Band
include Mongoid::Document
end
class Members
include Mongoid::Document
belongs_to :band
end

다음 예시 와 같이 선택적으로 inverse_of 옵션을 nil 로 설정하다 상위 클래스에 하위 클래스에 대한 has_one 또는 has_many 연관 관계가 없음을 나타낼 수 있습니다.

class Band
include Mongoid::Document
end
class Members
include Mongoid::Document
belongs_to :band, inverse_of: nil
end

has_and_belongs_to_many 매크로를 사용하여 클래스 모델에 다른 클래스와의 다대다 관계 포함되어 있음을 선언합니다. 다대다 관계 에서는 한 클래스의 각 문서 다른 클래스의 여러 문서와 연결될 수 있습니다. 다음 예시 Members 클래스에 대해 has_and_belongs_to_many 관계 가진 Band 클래스를 만듭니다. Band 문서 여러 개의 Members 문서를 참조할 수 있고, Members 문서 여러 개의 Band 문서를 참조할 수 있습니다.

class Band
include Mongoid::Document
has_and_belongs_to_many :members
end
class Members
include Mongoid::Document
has_and_belongs_to_many :bands
end

has_and_belongs_to_many 연결을 선언하면 두 모델 인스턴스 모두 연결된 문서의 _id 값 목록을 저장 . inverse_of 옵션을 nil 로 설정하다 연결된 문서의 _id 값을 모델 인스턴스 중 하나에만 저장 수 있습니다. 다음 예시 Mongoid가 관련 문서의 _id 값을 Band 클래스에만 저장 하도록 합니다.

class Band
include Mongoid::Document
has_and_belongs_to_many :tags, inverse_of: nil
end
class Tag
include Mongoid::Document
end

has_and_belongs_to_many 연관 관계가 있는 문서 업데이트 때, Mongoid는 업데이트된 문서 의 updated_at 필드 설정하지만, 연관된 문서의 updated_at 필드 설정하다 하지 않습니다.

집계 파이프라인 사용하여 참조된 연관 관계 전반에서 문서를 쿼리 할 수 있습니다. 집계 파이프라인 사용하면 여러 컬렉션에 걸쳐 쿼리를 생성하고 데이터를 지정된 형식으로 조작할 수 있습니다. 집계 파이프라인 사용에 대한 자세한 학습 애그리게이션 가이드 참조하세요.

간단한 쿼리의 경우 연관 관계를 직접 쿼리 할 수 있습니다. 컬렉션 에서 직접 쿼리 경우 컬렉션 자체에 있는 필드와 값에 대해서만 쿼리 할 수 있습니다. 쿼리 중인 컬렉션과 연결된 컬렉션은 직접 쿼리 할 수 없습니다.

예시 들어 다음 BandTour 클래스를 가정해 보겠습니다.

class Band
include Mongoid::Document
has_many :tours
field :name, type: String
end
class Tour
include Mongoid::Document
belongs_to :band
field :year, type: Integer
end

다음 예시 year 값이 2000 이상인 문서에 대해 Tour 클래스를 쿼리하고 해당 문서의 band_id 를 저장합니다. 그런 다음 Band 클래스에 해당 band_id 값을 가진 문서를 쿼리합니다.

band_ids = Tour.where(year: {'$gte' => 2000}).pluck(:band_id)
bands = Band.find(band_ids)

포함된 연결을 사용하여 동일한 컬렉션 에 서로 다른 유형의 문서를 저장 수 있습니다. Mongoid는 다음 매크로와의 포함된 연관 관계를 지원합니다:

  • embeds_one

  • embeds_many

  • embedded_in

  • recursively_embeds_one

  • recursively_embeds_many

다음 섹션에서는 이러한 연결 유형을 사용하는 방법을 설명합니다.

클래스 모델에 다른 클래스 유형의 내장된 문서 포함되도록 지정하려면 상위 클래스에서는 embeds_one 매크로를 사용하고 내장된 클래스에서는 embedded_in 매크로를 사용합니다. 다음 예시 Label 클래스가 포함된 Band 클래스를 만듭니다.

class Band
include Mongoid::Document
embeds_one :label
end
class Label
include Mongoid::Document
field :name, type: String
embedded_in :band
end

Mongoid는 embeds_one 매크로로 포함된 문서를 상위 문서 에 포함된 클래스와 이름이 같은 필드 로 저장합니다. 앞의 Label 문서는 다음 예시 와 같이 Band 문서 에 저장됩니다.

# Band document
{
"_id" : ObjectId("..."),
"label" : {
"_id" : ObjectId("..."),
"name" : "Periphery",
}
}

다음 예시 와 같이 store_as 옵션을 사용하여 내장된 문서 다른 이름으로 저장 수 있습니다.

class Band
include Mongoid::Document
embeds_one :label, store_as: "record_label"
end

클래스 모델에 서로 다른 클래스 유형의 내장된 문서가 여러 개 포함되도록 지정하려면 상위 클래스에서는 embeds_many 매크로를 사용하고, 내장된 클래스에서는 embedded_in 매크로를 사용합니다. 다음 예시 여러 개의 Album 유형 문서가 포함된 Band 클래스를 만듭니다.

class Band
include Mongoid::Document
embeds_many :albums
end
class Album
include Mongoid::Document
field :name, type: String
embedded_in :band
end

Mongoid는 상위 문서 에 embeds_many 매크로로 포함된 문서를 포함된 클래스와 동일한 이름의 배열 필드 로 저장합니다. 앞의 Album 문서는 다음 예시 와 같이 Band 문서 에 저장됩니다.

{
"_id" : ObjectId("..."),
"albums" : [
{
"_id" : ObjectId("..."),
"name" : "Omega",
}
]
}

다음 예시 와 같이 store_as 옵션을 사용하여 내장된 문서 다른 이름으로 저장 수 있습니다.

class Band
include Mongoid::Document
embeds_many :albums, store_as: "records"
end

recursively_embeds_onerecursively_embeds_many 매크로를 사용하여 동일한 유형의 문서를 하나 이상 상위 클래스에 포함할 수 있습니다. 두 매크로 모두 parent_* 메서드와 child_* 메서드를 통해 상위 및 하위 문서에 대한 접근자를 제공하며, 여기서 * 는 클래스 이름을 나타냅니다. 다음 예시 여러 개의 다른 Band 문서를 재귀적으로 포함하여 여러 밴드 이름을 나타내는 Band 클래스를 만듭니다.

class Band
include Mongoid::Document
field :name, type: String
recursively_embeds_many
end

다음 예시 와 같이 parent_bandchild_band 메서드를 통해 상위 및 하위 문서에 액세스 할 수 있습니다.

root = Band.new(name: "Linkin Park")
# Add child bands
child_one = root.child_band.build(name: "Lincoln Park")
child_two = root.child_band.build(name: "Xero")
# Access parent band
child_one.parent_band
# Outputs: root

점 표기법 사용하여 상위 클래스의 컬렉션 을 쿼리할 때 내장된 문서에 액세스 할 수 있습니다.

다음 예시 점 표기법 사용하여 Band 클래스에 포함된 Tour 유형 문서를 쿼리 . 이 쿼리 tours.year 값이 2000 이상인 문서를 반환합니다.

Band.where('tours.year' => {'$gte' => 2000})

다음 예시 와 같이 pluck 프로젝션 메서드를 사용하여 연결된 상위 문서를 검색하지 않고도 내장된 문서를 조회 할 수 있습니다.

# Get awards for bands that have toured since 2000
Band.where('tours.year' => {'$gte' => 2000}).pluck(:awards)

Mongoid 쿼리 메서드를 사용하여 애플리케이션 에 이미 로드된 문서의 포함된 연관 관계를 쿼리 할 수 있는 임베디드 매칭을 수행할 수 있습니다. Mongoid는 서버 에 쿼리를 보내지 않고 임베디드 매칭을 구현합니다.

포함된 일치 항목이 지원되는 쿼리 연산자는 다음과 같습니다.

다음 예시 $gte 비교 연산자 를 사용하여 로드된 Band 문서 의 포함된 tours 필드 쿼리합니다.

band = Band.where(name: 'Astral Projection').first
tours = band.tours.where(year: {'$gte' => 2000})

로드된 문서에 포함된 매칭에는 다음과 같은 알려진 제한 사항이 있습니다.

  • 다음 기능에 대해서는 임베디드 매칭이 구현되지 않습니다.

  • Mongoid는 Range 인수를 $gte$lte 조건이 있는 해시로 확장합니다. 이로 인해 경우에 따라 잘못된 쿼리가 발생할 수 있으며 InvalidQuery 예외가 발생합니다.

  • $regex 연산자 사용하면 $options 필드 에 옵션을 제공하면서 정규 표현식 객체 패턴 으로 지정할 수 없습니다. 정규 표현식 패턴 이 문자열인 경우에만 옵션을 제공할 수 있습니다.

  • MongoDB Server 4.0 이전 버전에서는 $type 인수의 유효성을 엄격하게 검사하지 않습니다.

기본값 으로 Mongoid는 내장된 문서에 _id 필드 추가합니다. 모델에서 _id 필드 명시적으로 지정하고 기본값 을 생략하여 내장된 문서에서 이 필드 생략할 수 있습니다. 다음 예시 _id 필드 Albums 클래스에 추가하지 않도록 Mongoid에 지시합니다.

class Album
include Mongoid::Document
field :name, type: String
field :_id, type: Object
embedded_in :band
end

앞의 Albums 클래스에서는 _id 필드 자동으로 추가되지 않습니다. 기본값 이 없으면 모델에 값을 제공하지 않는 한 Mongoid가 데이터베이스 에 값을 저장 하지 않습니다.

다음 방법 중 하나를 사용하여 embeds_many 연관 관계에서 하위 문서를 삭제 수 있습니다.

  • clear

  • delete_all

  • destroy_all

메서드는 $unset 연산자 연산자 clear 사용하여 상위 문서 에서 내장된 연결 전체를 제거 .clear 메서드는 destroy 콜백을 실행 하지 않습니다. 다음 예시 clear 메서드를 사용하여 클래스에서 포함된 연결을 모두 제거 Band .

band = Band.find(...)
band.tours.clear

delete_all 메서드는 $pullAll 연산자 연산자 사용하여 포함된 연관 관계에서 문서를 제거 . delete_all 는 아직 로드되지 않은 경우 연관 관계를 로드한 다음 애플리케이션 에 존재하는 문서만 제거합니다.delete_all 메서드는 destroy 콜백을 실행 하지 않습니다. 다음 예시 메서드를 사용하여 delete_all Album 클래스에서 내장된 문서를 모두 제거 Band .

band = Band.find(...)
band.tours.delete_all

또한 메서드는 destroy_all $pullAll 연산자 연산자 사용하여 포함된 연결에서 문서를 제거 . 또한 destroy 관련 문서에 정의된 콜백을 실행합니다. 다음 예시 destroy_all 메서드를 사용하여 클래스에서 내장된 Album 문서를 모두 제거 Band .

band = Band.find(...)
band.tours.destroy_all

Mongoid를 사용하여 애플리케이션 에서 연관 관계가 작동하는 방식을 사용자 정의할 수 있습니다. 다음 섹션에서는 연결 동작을 사용자 지정하는 방법을 설명합니다.

확장을 사용하면 연관 관계에 사용자 정의 기능을 추가할 수 있습니다. 다음 예시 와 같이 연결 정의에 차단 지정하여 연결에 대한 확장을 정의할 수 있습니다.

class Band
include Mongoid::Document
embeds_many :albums do
def find_by_name(name)
where(name: name).first
end
end
end
band.albums.find_by_name("Omega") # returns album "Omega"

class_name 매크로를 사용하여 연결에 대한 사용자 지정 클래스 이름을 지정할 수 있습니다. 이는 연관 관계의 이름을 클래스 이름이 아닌 다른 이름으로 지정할 때 유용합니다. 다음 예시 class_name 매크로를 사용하여 records 라는 포함된 연결이 Album 클래스를 나타내도록 지정합니다.

class Band
include Mongoid::Document
embeds_many :records, class_name: "Album"
end

기본값 으로 Mongoid는 연관 관계를 조회할 때 상위 클래스의 _id 필드 사용합니다. primary_keyforeign_key 매크로를 사용하여 사용할 다른 필드를 지정할 수 있습니다. 다음 예시 Band 클래스의 albums 연결에 대한 새 프라이머리 키와 외래 키를 지정합니다.

class Band
include Mongoid::Document
field :band_id, type: String
has_many :albums, primary_key: 'band_id', foreign_key: 'band_id_ref'
end
class Album
include Mongoid::Document
field :band_id_ref, type: String
belongs_to :band, primary_key: 'band_id', foreign_key: 'band_id_ref'
end

has_and_belongs_to_many 연결을 지정하는 경우 inverse_primary_keyinverse_foreign_key 매크로를 사용할 수도 있습니다. inverse_primary_key 매크로는 원격 모델이 문서를 조회하는 데 사용하는 로컬 모델의 필드 를 지정합니다. inverse_foreign_key 매크로는 inverse_primary_key에서 찾은 값을 저장하는 원격 모델의 필드 를 지정합니다.

다음 예시 has_and_belongs_to_many 연관 관계의 BandMembers 클래스에 대한 새 프라이머리 및 외래 키를 지정합니다.

class Band
include Mongoid::Document
field :band_id, type: String
field :member_ids, type: Array
has_many :members,
primary_key: 'member_id', foreign_key: 'member_ids',
inverse_primary_key: 'band_id', inverse_foreign_key: 'band_ids'
end
class Member
include Mongoid::Document
field :member_id, type: String
field :band_ids, type: Array
has_many :bands,
primary_key: 'band_id', foreign_key: 'band_ids',
inverse_primary_key: 'member_id', inverse_foreign_key: 'member_ids'
end

scope 매개 변수를 사용하여 연결 범위를 지정할 수 있습니다. scope 매개변수는 Mongoid가 연관 관계의 일부로 간주하는 문서를 결정합니다. 범위 지정 연결은 쿼리 시 범위 조건과 일치하는 문서만 반환합니다. scope 를 아리티가 0인 Proc 또는 관련 모델의 명명된 범위를 참조하는 Symbol 로 설정하다 수 있습니다. 다음 예시 Band 클래스의 연결에 대한 사용자 지정 범위를 설정합니다.

class Band
include Mongoid::Document
has_many :albums, scope: -> { where(published: true) }
# Uses a scope called "upcoming" on the Tour model
has_many :tours, scope: :upcoming
end

참고

범위 조건과 일치하지 않는 문서를 연결에 추가할 수 있습니다. Mongoid는 문서를 데이터베이스 에 저장하고 관련 메모리에 표시됩니다. 그러나 연결을 쿼리할 때는 문서가 표시되지 않습니다.

Mongoid는 연관 관계를 메모리에 로드할 때, 기본값 으로 validates_associated 매크로를 사용하여 하위 항목도 있는지 확인합니다. Mongoid는 다음 연결 유형에 대해 하위 항목의 유효성을 검사합니다.

  • embeds_many

  • embeds_one

  • has_many

  • has_one

  • has_and_belongs_to_many

다음 예시 와 같이 연결을 정의할 때 validate 매크로를 false 로 설정하여 이 유효성 검사 동작을 해제할 수 있습니다.

class Band
include Mongoid::Document
embeds_many :albums, validate: false
end

Mongoid는 일대일 및 일대다 연관 관계의 하위 클래스에 대한 다형성을 지원합니다. 다형성 연결을 사용하면 단일 연결에 서로 다른 클래스 유형의 객체가 포함될 수 있습니다. 하위 연결에서 polymorphic 옵션을 true 로 설정하고 상위 연결에 as 옵션을 추가하여 다형성 연결을 정의할 수 있습니다. 다음 예시 Band 클래스에 다형성 연관을 생성합니다.

class Tour
include Mongoid::Document
has_one :band, as: :featured
end
class Label
include Mongoid::Document
has_one :band, as: :featured
end
class Band
include Mongoid::Document
belongs_to :featured, polymorphic: true
end

앞의 예시 에서 Band 클래스의 :featured 연관 관계는 Label 또는 Album 문서 포함할 수 있습니다.

중요

Mongoid는 자식에서 부모로의 다형성만 지원합니다. 상위 has_one 또는 has_many 연관 관계를 다형성으로 지정할 수 없습니다.

has_and_belongs_to_many 다형성을 지원하지 않는 연관 관계들입니다.

버전 9.0.2부터 Mongoid는 글로벌 레지스트리를 통해 사용자 지정 다형성 유형을 지원합니다. 다른 클래스를 나타내는 대체 키를 지정하여 데이터에서 코드를 분리할 수 있습니다. 다음 예시 문자열 "artist"Band 클래스의 대체 키로 지정합니다.

class Band
include Mongoid::Document
identify_as 'artist'
has_many :albums, as: :record
end

앞의 예시 에서 identify_as 지시문은 Mongoid가 Band 클래스를 데이터베이스 에 "artist" 문자열로 저장 하도록 지시합니다.

다음 예시 와 같이 여러 개의 별칭을 지정할 수도 있습니다.

class Band
include Mongoid::Document
identify_as 'artist', 'group', 'troupe'
has_many :albums, as: :record
end

앞의 예시 에서 artist 이 기본값 이름이고 다른 이름은 레코드 조회에만 사용됩니다. 이를 통해 데이터의 연결을 끊지 않고 코드를 리팩터링할 수 있습니다.

다형성 유형 별칭은 전역적입니다. 지정하는 키는 전체 코드베이스에서 고유해야 합니다. 그러나 모델의 다양한 하위 집합에 사용할 수 있는 대체 리졸버를 등록할 수 있습니다. 이 경우 키는 각 해석기에 대해서만 고유해야 합니다. 다음 예시 대체 리졸버를 등록하는 방법을 보여줍니다.

Mongoid::ModelResolver.register_resolver Mongoid::ModelResolver.new, :mus
Mongoid::ModelResolver.register_resolver Mongoid::ModelResolver.new, :tool
module Music
class Band
include Mongoid::Document
identify_as 'bnd', resolver: :mus
end
end
module Tools
class Band
include Mongoid::Document
identify_as 'bnd', resolver: :tool
end
end

Music::BandTools::Band 모두 "bnd"(으)로 별칭이 지정되어 있지만 각 모델은 충돌을 피하기 위해 자체 리졸버를 사용합니다.

참조된 연관 관계에 dependent 옵션을 제공하여 문서 삭제될 때 Mongoid가 관련 문서를 처리하는 방법을 지정할 수 있습니다. 다음 옵션을 지정할 수 있습니다.

  • delete_all: 모델 콜백을 실행 하지 않고 모든 하위 문서를 삭제합니다.

  • destroy: 하위 문서를 삭제하고 모든 모델 콜백을 실행합니다.

  • nullify: 하위 문서의 외래 키를 nil로 설정합니다. 하위 문서 상위 문서만 참조하는 경우 고아가 될 수 있습니다.

  • restrict_with_exception: 하위 문서 비어 있지 않으면 예외가 발생합니다.

  • restrict_with_error: 하위 문서 비어 있지 않으면 작업을 취소하고 false 를 반환합니다.

dependent 옵션을 지정하지 않으면 Mongoid는 상위 문서 삭제될 때 하위 문서 변경하지 않은 상태로 둡니다. 하위 문서 삭제된 상위 문서 계속 참조하며, 상위 문서를 통해서만 참조되는 경우 하위 문서 고아가 됩니다.

다음 예시 Band 클래스에 dependent 옵션을 지정합니다.

class Band
include Mongoid::Document
has_many :albums, dependent: :delete_all
belongs_to :label, dependent: :nullify
end

기본값 으로 Mongoid는 상위 문서 저장할 때 포함되지 않은 연관 관계의 관련 문서를 자동으로 저장하지 않습니다. 이로 인해 존재하지 않는 문서에 대한 dangling 참조가 발생할 수 있습니다.

참조된 연관 관계에서 autosave 옵션을 사용하면 상위 문서 저장할 때 연관된 문서를 자동으로 저장할 수 있습니다. 다음 예시 연결된 Album 클래스가 있는 Band 클래스를 만들고 autosave 옵션을 지정합니다.

class Band
include Mongoid::Document
has_many :albums
end
class Album
include Mongoid::Document
belongs_to :band, autosave: true
end
band = Band.new
album = Album.create!(band: band)
# The band is persisted at this point.

참고

Mongoid는 accepts_nested_attributes_for 옵션을 사용하는 연관 관계에 자동 저장 기능을 자동으로 추가합니다.

Mongoid는 내장된 문서를 상위 문서 에 저장하므로 내장된 연관 관계에 대해서는 autosave 옵션을 지정할 필요가 없습니다.

has_oneembeds_one와 같은 일대일 연결에 autobuild 옵션을 추가하여 nil 연결에 액세스할 때 새 문서 자동으로 인스턴스화할 수 있습니다. 다음 예시 Band 클래스의 연관 관계에 autobuild 옵션을 추가합니다:

class Band
include Mongoid::Document
embeds_one :label, autobuild: true
has_one :producer, autobuild: true
end

Mongoid가 문서 updated_at 터치하면 문서의 필드 현재 날짜 및 시간으로 업데이트합니다. 모든 연관 관계에 touch 옵션을 추가하여 belongs_to 하위 문서 업데이트될 때마다 Mongoid가 상위 문서 접촉하도록 할 수 있습니다. 다음 예시 클래스의 touch 연관 관계에 옵션을 Band 추가합니다:

class Band
include Mongoid::Document
field :name
belongs_to :label, touch: true
end

touch 옵션을 사용하여 상위 연관 관계의 다른 필드 문자열이나 기호로 지정할 수도 있습니다. Mongoid가 상위 연관 관계를 건드릴 때, updated_at 필드 와 지정된 필드 모두 현재 날짜 및 시간으로 설정합니다.

다음 예시 Mongoid에게 bands_updated_at 필드 터치하도록 지시합니다.

class Band
include Mongoid::Document
belongs_to :label, touch: :bands_updated_at
end

참고

포함된 연관 관계에서, 내장된 문서 가 터치될 때, Mongoid는 그 부모들을 재귀적으로 터치합니다. 이 때문에 embedded_in 연관 관계에 touch 속성을 추가할 필요가 없습니다.

Mongoid는 embedded_in 연관 관계에서 터치할 추가 필드를 지정하는 지원 하지 않습니다.

counter_cache 옵션을 사용하여 연결된 필드 에 속하는 객체 수를 저장 수 있습니다. 이 옵션을 지정하면 Mongoid는 관련 모델에 예비 속성을 저장하여 개수를 저장 . 이 때문에 관련 클래스에서 Mongoid::Attributes::Dynamic 모듈을 지정해야 합니다.

다음 예시 Band 클래스에 counter_cache 옵션을 추가하고 Label 클래스에 Mongoid::Attributes::Dynamic 를 지정합니다.

class Band
include Mongoid::Document
belongs_to :label, counter_cache: true
end
class Label
include Mongoid::Document
include Mongoid::Attributes::Dynamic
has_many :bands
end

연관 관계를 정의할 때, Mongoid는 해당 연관 관계에 대한 메타데이터 저장합니다. 모델 클래스 또는 문서 에서 reflect_on_association 메서드를 호출하거나 특정 문서 의 메타데이터 에 직접 액세스하여 메타데이터 액세스 할 수 있습니다. 다음 예시 reflect_on_association 메서드를 사용하고 직접 액세스 하여 메타데이터 액세스 방법을 보여 줍니다.

# Get the metadata for a named association from the class or document
Model.reflect_on_association(:<association_name>)
# Directly access metadata on a document
model.associations[:<association_name>]

참고

앞의 예시 에서 <association_name> 을 연결 이름으로 바꿉니다.

모든 연관 관계에는 연관된 문서 에 대한 정보를 저장 속성이 포함되어 있습니다. 연관 관계에는 다음과 같은 속성이 포함됩니다:

  • _target: 프록시된 문서

  • _base: 연관 관계가 정의된 문서

  • _association: 연관 관계에 대한 정보

다음 예시 앞의 각 속성에 액세스합니다.

class Band
include Mongoid::Document
embeds_many :songs
end
Band.songs = [ song ]
Band.songs._target # returns [ song ]
Band.songs._base # returns band
Band.songs._association # returns the association metadata

다음 표는 _association 속성에 저장된 정보를 보여줍니다.

메서드
설명

Association#as

다형성 하위에 대한 상위 항목의 이름입니다.

Association#as?

as 옵션이 존재하는지 여부를 반환합니다.

Association#autobuilding?

연결이 자동 빌드인지 여부를 반환합니다.

Association#autosaving?

연결이 자동 저장되는지 여부를 반환합니다.

Association#cascading_callbacks?

연관 관계에 부모로부터 계단식으로 내려오는 콜백이 있는지 여부를 반환합니다.

Association#class_name

프록시된 문서 의 클래스 이름입니다.

Association#cyclic?

연관 관계가 순환 연결인지 여부를 반환합니다.

Association#dependent

연결의 종속 옵션입니다.

Association#destructive?

연결에 종속 삭제 또는 삭제 메서드가 있는 경우 true 를 반환합니다.

Association#embedded?

연관이 다른 문서에 포함되어 있는지 여부를 반환합니다.

Association#forced_nil_inverse?

연관 관계에 nil 역원이 정의되어 있는지 여부를 반환합니다.

Association#foreign_key

외래 키 필드 의 이름입니다.

Association#foreign_key_check

외래 키 필드의 더티 검사 메서드 이름입니다.

Association#foreign_key_setter

외래 키 필드의 세터 이름입니다.

Association#indexed?

외래 키가 자동 인덱싱되는지 여부를 반환합니다.

Association#inverses

모든 역방향 연관 관계의 이름입니다.

Association#inverse

단일 역방향 연관 관계의 이름입니다.

Association#inverse_class_name

역방향에 있는 연관 관계의 클래스 이름입니다.

Association#inverse_foreign_key

역방향에 있는 외래 키 필드 의 이름입니다.

Association#inverse_klass

역방향 연관 관계의 클래스입니다.

Association#inverse_association

역방향 연관 관계의 메타데이터 .

Association#inverse_of

명시적으로 정의된 역방향 연관 관계의 이름입니다.

Association#inverse_setter

역방향을 설정하다 데 사용되는 메서드의 이름입니다.

Association#inverse_type

역방향의 다형성 유형 필드 이름입니다.

Association#inverse_type_setter

다형성 유형 필드의 역방향 설정자 이름입니다.

Association#key

연관 관계를 가져오는 데 사용되는 속성 해시의 필드 이름입니다.

Association#klass

연결에 있는 프록시 문서의 클래스입니다.

Association#name

연관 관계 이름입니다.

Association#options

ActiveRecord와의 API 호환성을 위해 self를 반환합니다.

Association#order

연관 관계의 사용자 정의 정렬 옵션.

Association#polymorphic?

연관 관계가 다형성인지 여부를 반환합니다.

Association#setter

연관 관계를 설정하다 필드 의 이름입니다.

Association#store_as

포함된 연관 관계를 저장 속성의 이름입니다.

Association#touchable?

연결에 터치 옵션이 있는지 여부를 반환합니다.

Association#type

다형성 유형을 가져올 필드 의 이름입니다.

Association#type_setter

다형성 유형을 설정하다 필드 의 이름입니다.

Association#validate?

연관 관계에 연결된 유효성 검사가 있는지 여부를 반환합니다.

돌아가기

콜백