연관 관계
이 페이지의 내용
개요
Mongoid의 연관 관계를 사용하면 모델 간의 관계를 생성할 수 있습니다. 이 가이드 에서는 Mongoid가 지원하는 다양한 유형의 연결과 이를 애플리케이션 에서 사용하는 방법에 대해 학습 수 있습니다.
참조된 연관 관계
참조된 연관 관계를 사용하면 한 모델이 다른 모델을 참조하는 두 모델 간의 관계 만들 수 있습니다. Mongoid는 다음과 같은 참조 연관 관계 유형을 지원합니다:
has_one
has_many
belongs_to
has_and_belongs_to_many
다음 섹션에서는 이러한 각 연결 유형을 사용하는 방법에 대해 설명합니다.
Has One
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
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
한 클래스가 나타내는 문서 다른 클래스가 나타내는 문서 의 하위 문서임을 선언하려면 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
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
필드 설정하다 하지 않습니다.
참조된 연관 관계 쿼리
집계 파이프라인 사용하여 참조된 연관 관계 전반에서 문서를 쿼리 할 수 있습니다. 집계 파이프라인 사용하면 여러 컬렉션에 걸쳐 쿼리를 생성하고 데이터를 지정된 형식으로 조작할 수 있습니다. 집계 파이프라인 사용에 대한 자세한 학습 애그리게이션 가이드 참조하세요.
간단한 쿼리의 경우 연관 관계를 직접 쿼리 할 수 있습니다. 컬렉션 에서 직접 쿼리 경우 컬렉션 자체에 있는 필드와 값에 대해서만 쿼리 할 수 있습니다. 쿼리 중인 컬렉션과 연결된 컬렉션은 직접 쿼리 할 수 없습니다.
예시 들어 다음 Band
및 Tour
클래스를 가정해 보겠습니다.
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
클래스 모델에 다른 클래스 유형의 내장된 문서 포함되도록 지정하려면 상위 클래스에서는 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
클래스 모델에 서로 다른 클래스 유형의 내장된 문서가 여러 개 포함되도록 지정하려면 상위 클래스에서는 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_one
및 recursively_embeds_many
매크로를 사용하여 동일한 유형의 문서를 하나 이상 상위 클래스에 포함할 수 있습니다. 두 매크로 모두 parent_*
메서드와 child_*
메서드를 통해 상위 및 하위 문서에 대한 접근자를 제공하며, 여기서 *
는 클래스 이름을 나타냅니다. 다음 예시 여러 개의 다른 Band
문서를 재귀적으로 포함하여 여러 밴드 이름을 나타내는 Band
클래스를 만듭니다.
class Band include Mongoid::Document field :name, type: String recursively_embeds_many end
다음 예시 와 같이 parent_band
및 child_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})
로드된 문서에 포함된 매칭에는 다음과 같은 알려진 제한 사항이 있습니다.
다음 기능에 대해서는 임베디드 매칭이 구현되지 않습니다.
$where와같은 JavaScript 코드를 실행하는 연산자
$expr 및 $jsonSchema와같은 다른 서버 기능을 통해 구현되는 연산자
Mongoid는
Range
인수를$gte
및$lte
조건이 있는 해시로 확장합니다. 이로 인해 경우에 따라 잘못된 쿼리가 발생할 수 있으며InvalidQuery
예외가 발생합니다.$regex
연산자 사용하면$options
필드 에 옵션을 제공하면서 정규 표현식 객체 패턴 으로 지정할 수 없습니다. 정규 표현식 패턴 이 문자열인 경우에만 옵션을 제공할 수 있습니다.MongoDB Server 4.0 이전 버전에서는
$type
인수의 유효성을 엄격하게 검사하지 않습니다.
_id 필드 생략
기본값 으로 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_key
및 foreign_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_key
및 inverse_foreign_key
매크로를 사용할 수도 있습니다. inverse_primary_key
매크로는 원격 모델이 문서를 조회하는 데 사용하는 로컬 모델의 필드 를 지정합니다. inverse_foreign_key
매크로는 inverse_primary_key
에서 찾은 값을 저장하는 원격 모델의 필드 를 지정합니다.
다음 예시 has_and_belongs_to_many
연관 관계의 Band
및 Members
클래스에 대한 새 프라이머리 및 외래 키를 지정합니다.
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::Band
와 Tools::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_one
및 embeds_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
속성에 저장된 정보를 보여줍니다.
메서드 | 설명 |
---|---|
| 다형성 하위에 대한 상위 항목의 이름입니다. |
|
|
| 연결이 자동 빌드인지 여부를 반환합니다. |
| 연결이 자동 저장되는지 여부를 반환합니다. |
| 연관 관계에 부모로부터 계단식으로 내려오는 콜백이 있는지 여부를 반환합니다. |
| 프록시된 문서 의 클래스 이름입니다. |
| 연관 관계가 순환 연결인지 여부를 반환합니다. |
| 연결의 종속 옵션입니다. |
| 연결에 종속 삭제 또는 삭제 메서드가 있는 경우 |
| 연관이 다른 문서에 포함되어 있는지 여부를 반환합니다. |
| 연관 관계에 |
| 외래 키 필드 의 이름입니다. |
| 외래 키 필드의 더티 검사 메서드 이름입니다. |
| 외래 키 필드의 세터 이름입니다. |
| 외래 키가 자동 인덱싱되는지 여부를 반환합니다. |
| 모든 역방향 연관 관계의 이름입니다. |
| 단일 역방향 연관 관계의 이름입니다. |
| 역방향에 있는 연관 관계의 클래스 이름입니다. |
| 역방향에 있는 외래 키 필드 의 이름입니다. |
| 역방향 연관 관계의 클래스입니다. |
| 역방향 연관 관계의 메타데이터 . |
| 명시적으로 정의된 역방향 연관 관계의 이름입니다. |
| 역방향을 설정하다 데 사용되는 메서드의 이름입니다. |
| 역방향의 다형성 유형 필드 이름입니다. |
| 다형성 유형 필드의 역방향 설정자 이름입니다. |
| 연관 관계를 가져오는 데 사용되는 속성 해시의 필드 이름입니다. |
| 연결에 있는 프록시 문서의 클래스입니다. |
| 연관 관계 이름입니다. |
| ActiveRecord와의 API 호환성을 위해 |
| 연관 관계의 사용자 정의 정렬 옵션. |
| 연관 관계가 다형성인지 여부를 반환합니다. |
| 연관 관계를 설정하다 필드 의 이름입니다. |
| 포함된 연관 관계를 저장 속성의 이름입니다. |
| 연결에 터치 옵션이 있는지 여부를 반환합니다. |
| 다형성 유형을 가져올 필드 의 이름입니다. |
| 다형성 유형을 설정하다 필드 의 이름입니다. |
| 연관 관계에 연결된 유효성 검사가 있는지 여부를 반환합니다. |