2013-03-29 3 views
0

나는 많은 bar를 포함하는 Foo라는 mongoid 모델이 있다고 해봅시다.Mongoid를 사용하는 자체 참조 임베디드 문서

class Foo 
    ... 
    embeds_many :bar 
    ... 
end 

class Bar 
    ... 
    embedded_in :foo 
    ... 
end 

바를 자기와 연결하는 관계를 만들고 싶습니다. 관계는 항상 동일한 Foo 문서에 포함 된 두 개의 문서와 관련됩니다. 나는 관계를 부를 때 아무것도 돌려받지 않고 이것을 할 수있는 것처럼 보이지 않는다. 나는 discovered_by ID가 나는 전무를 얻을 다음 바 문서에 설정하고 내가 시도 할 다른 바 문서를 가리키는 동안

belongs_to :discovered_by, :class_name => 'Bar' 

또한

has_one :discovered_by, :class_name => 'Bar' 

시도 (가정 한 첫 번째 푸의 첫 번째 줄은 discovered_by_id 세트)이 항상 ID 세트를 갖는 doucment에도 불구하고 nil을 반환합니다

Foo.first.bars.first.discovered_by 

있습니다. 왜 이런 일이 벌어지고 있는지에 대한 생각은? 어떤 도움을 주셔서 감사합니다.

답변

1

사용자 cannot have references to embedded models - 두 문서가 같은 문서에 포함되어 있어도 마찬가지입니다. 관계를 올바르게 구성한 경우

belongs_to :discovered_by, :class_name => 'Bar', inverse_of: :discovered 
has_one :discovered, :class_name => 'Bar', inverse_of: :discovered_by 

몽고 이드는 Mongoid::Errors::MixedRelations 예외를 발생시킵니다. 이러한 개체를 포함시키는 것이 여전히 최선의 선택인지 다시 생각해 볼 수도 있습니다. 해결 방법은 id 만 저장하고 상위 개체를 쿼리하는 것입니다.

class Bar 
    include Mongoid::Document 
    embedded_in :foo 
    field :discovered_by_id, type: Moped::BSON::ObjectId 

    def discovered_by 
     foo.bars.find(discovered_by_id) if discovered_by_id 
    end 

    def discovered_by=(bar) 
     self.discovered_by_id = bar.id 
    end 
end 
+0

해결 방법을 제안한 것처럼 ID를 저장해야합니다. 이상적이지는 않지만 내 목적을 달성합니다. 임베디드 문서 재검토에 대한 의견은 흥미 롭습니다. 같은 부모 문서에 관련있는 두 개의 문서를 생각하는 일을하는 "몽고 (mongo) 방식"에 반대합니까? 몽고이의 구현과 일관성이 있다고 봅니다. – Stewart

+1

예, 일반적으로 임베디드 문서에 대한 참조는 바람직하지 않습니다. 부분적으로 기술적 인 관점에서 (관계를 사용하는 객체는 임베디드 모델의 각 레이어에 대한 부모 객체를 알아야 함) 및 디자인 관점 (임베디드 객체는 부모를 통해서만 액세스해야합니다). 그러나, 당신의 예제는 다소 뚜렷한 경우입니다. 여러분이 참조하고있는 레코드의 부모 객체를 확실히 알고 있습니다 ('foo'). 아마도 임시 해결책으로 갈 것입니다 - 단점은 표준'belongs_to'와'has_one' 헬퍼를 사용할 수 없다는 것입니다. –