Docs Menu

중첩된 속성

이 가이드 에서는 모델에 중첩된 속성을 정의하여 문서 및 문서의 연관 관계에 대한 데이터 작업을 활성화 방법을 학습 수 있습니다. 중첩된 속성을 정의한 후 단일 매개변수 해시에 최상위 문서 및 관련 문서에 대한 업데이트를 지정할 수 있습니다. 이는 애플리케이션 단일 양식 내에서 여러 문서를 편집해야 하는 경우 유용할 수 있습니다.

포함된 연관 관계나 참조된 연관 관계에 대해 중첩된 속성을 활성화 할 수 있습니다. 연결에 중첩된 속성을 추가하려면 모델 클래스를 정의할 때 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 작업 수행에 대해 자세히 학습 데이터 작업 수행 가이드 참조하세요.

연관 관계에 대해 자세히 학습 연관 관계 가이드 참조하세요.