중첩된 속성
개요
이 가이드 에서는 모델에 중첩된 속성을 정의하여 문서 및 문서의 연관 관계에 대한 데이터 작업을 활성화 방법을 학습 수 있습니다. 중첩된 속성을 정의한 후 단일 매개변수 해시에 최상위 문서 및 관련 문서에 대한 업데이트를 지정할 수 있습니다. 이는 애플리케이션 단일 양식 내에서 여러 문서를 편집해야 하는 경우 유용할 수 있습니다.
행동
포함된 연관 관계나 참조된 연관 관계에 대해 중첩된 속성을 활성화 할 수 있습니다. 연결에 중첩된 속성을 추가하려면 모델 클래스를 정의할 때 accepts_nested_attributes_for
매크로에 연결 이름을 제공합니다.
다음 코드는 Band
모델 클래스에 포함된 연결을 정의하고 accepts_nested_attributes_for
매크로를 포함합니다.
class Band include Mongoid::Document embeds_many :albums belongs_to :producer accepts_nested_attributes_for :albums, :producer end
참고
자동 저장 활성화
참조된 연관 관계에 중첩된 속성 기능을 추가하면, Mongoid는 자동으로 해당 연관 관계에 대한 자동 저장을 활성화합니다.
연관 관계에서 중첩된 속성 동작을 활성화 Mongoid는 기본 모델에 특수 메서드를 추가합니다. 이 메서드를 사용하여 속성을 업데이트 수 있습니다.
메서드 이름은 _attributes
접미사가 붙은 연결 이름입니다. 예시 들어 producers
연관 관계를 업데이트 하는 세터 메서드는 producer_attributes
입니다.
이 메서드를 직접 사용하거나 최상위 클래스에 대한 업데이트에서 메서드 이름을 속성으로 사용할 수 있습니다. 이 경우 Mongoid는 내부적으로 적절한 setter 메서드를 호출합니다.
다음 코드는 Band
인스턴스 를 검색한 다음 중첩된 속성 업데이트 메서드 producer_attributes
를 사용하여 연결 문서 의 값을 설정하다 .
# Retrieves a Band instance band = Band.where(name: 'Tennis').first # Updates the "producer" association band.producer_attributes = { name: 'Alaina Moore' }
중첩된 속성을 업데이트 방법에는 여러 가지가 있습니다.
<association name>_attributes
setter 메서드를 사용합니다.attributes
setter 메서드를 사용하고 값에<association name>_attributes
를 지정하여 연결을 업데이트 .update_attributes
setter 메서드를 사용하고 값에 속성 이름을 지정하여 연결을 업데이트 .update
메서드를 사용하고 값에<association name>_attributes
를 지정하여 연결을 업데이트 .create
메서드를 사용하고 값에<association name>_attributes
을(를) 지정하여 연결을 생성합니다.
다음 예시 단일 성명서 에서 연결된 album
레코드가 있는 Band
인스턴스 만드는 방법을 보여 줍니다.
band = Band.create( name: 'Tennis', albums_attributes: [ { name: 'Swimmer', year: 2020 }, { name: 'Young & Old', year: 2013 }] )
중첩 문서 만들기
중첩된 속성 기능 사용하여 중첩된 새 문서를 만들 수 있습니다. 문서 만들 때 _id
필드 생략합니다. 다음 코드에서는 update
메서드를 사용하여 기존 Band
인스턴스 에 중첩된 album
문서 만듭니다.
band = Band.where(name: 'Vampire Weekend').first band.update(albums_attributes: [ { name: 'Contra', year: 2010 } ])
이 조치 기존 중첩 문서를 변경하지 않고 기존 설정하다 에 새 문서 추가합니다.
중첩된 문서 업데이트
중첩된 속성 기능 사용하여 기존에 중첩된 문서를 업데이트 할 수 있습니다. 속성을 사용하여 중첩된 문서 업데이트 하도록 Mongoid에 지시하려면 문서의 _id
값을 update
메서드에 전달합니다. 다음 예시 albums
항목의 _id
값을 사용하여 year
필드 업데이트 .
band = Band.where(name: 'Vampire Weekend').first # Retrieves the first entry from the albums array album = band.albums.first # Updates the entry by passing the _id value band.update(albums_attributes: [ { _id: album._id, year: 2011 } ])
중요
NoMatchingDocument
Mongoid가 지정된 _id
값을 가진 문서 와 일치하지 않으면 Mongoid::Errors::DocumentNotFound
예외가 발생합니다.
중첩된 문서 삭제
update
메서드에 _destroy
속성을 지정하여 중첩된 문서를 삭제 수 있습니다. 중첩된 문서 의 삭제를 활성화 하려면 다음 코드에 표시된 대로 accepts_nested_attributes_for
선언에서 allow_destroy: true
를 설정하다 해야 합니다.
class Band # ... accepts_nested_attributes_for :albums, allow_destroy: true end
다음 코드는 _destroy
속성을 사용하여 Band
인스턴스 의 첫 번째 albums
항목을 삭제 .
band = Band.where(name: 'Vampire Weekend').first # Retrieves the first entry from the albums array album = band.albums.first # Deletes the entry by passing the _id value band.update(albums_attributes: [ { _id: album._id, _destroy: true } ])
중요
NoMatchingDocument
Mongoid가 지정된 _id
값을 가진 문서 와 일치하지 않으면 Mongoid::Errors::DocumentNotFound
예외가 발생합니다.
중첩된 문서에서 작업 결합
중첩된 속성 기능 사용하여 중첩된 문서에 대해 여러 데이터 작업을 수행할 수 있습니다.
다음 코드는 중첩된 문서 만들고, 기존 문서 업데이트하고, Band
인스턴스 의 albums
배열 에서 문서 삭제합니다.
band = Band.where(name: 'Yeah Yeah Yeahs').first # Performs multiple data changes band.update(albums_attributes: [ { name: 'Show Your Bones', year: 2006 }, { _id: 1, name: 'Fever To T3ll' }, { _id: 2, _destroy: true } ])
추가 정보
쿼리에 대해 자세히 학습 문서 쿼리 지정 가이드 참조하세요.
CRUD 작업 수행에 대해 자세히 학습 데이터 작업 수행 가이드 참조하세요.
연관 관계에 대해 자세히 학습 연관 관계 가이드 참조하세요.