2011-11-03 4 views
1

이것은 내가 미친 듯이 몰아 넣고 있으며, 내가 임베디드 문서를 잘못 사용하고 있다고 생각하는 지점에 도달했습니다.MongoDB MongoMapper 업데이트 임베디드 문서 (루비 레일)

class User 
    include MongoMapper::Document 
    key :name, String 
    many :businesses 
end 

class Business 
    include MongoMapper::EmbeddedDocument 
    key :name, String 
    one :address 
    many :clients 
    belongs_to :user 
end 

class Address 
    include MongoMapper::EmbeddedDocument 
    key :name, String 
    belongs_to :business 
end 

class Client 
    include MongoMapper::EmbeddedDocument 
    key :name, String 
    belongs_to :business 
end 

내가 지금하는 사업에 주소를 추가하고 싶은 것이 다음 사용자와 비즈니스를 만든하지만 난에 관리 할 수 ​​없습니다.

내가 이름이나 ID와 사업 배열을 통해 다음 루프에 의해 사용자를 찾는 생각할 수있는 유일한 것은, 이름과 일치하는 주소를 설정 사업을 찾을 ...

하지만 솔직히 말해서 정말로 절름발이가 들린다. 나는 그것을하는 더 우아한 방법이 있다고 가정한다.

는 삽입 할 때, 대신 belongs_toembedded_in 사용하면

+0

말 그대로 내가 원하는 것 : set address to something user.businesses.business.id == something ... –

답변

0

첫째을 감사드립니다.

class Business 
    include MongoMapper::EmbeddedDocument 
    key :name, String 
    one :address 
    many :clients 
    embedded_in :user 
end 

class Address 
    include MongoMapper::EmbeddedDocument 
    key :name, String 
    embedded_in :business 
end 

class Client 
    include MongoMapper::EmbeddedDocument 
    key :name, String 
    embedded_in :business 
end 

이유

embedded_in 단순히 _parent_document 방법에 별칭을 생성하는 반면, 내부, belongs_to이 포함되지 않은 단체에 대한 데이터베이스 상호 작용의 모든 종류를 수행하는 복잡한 연결 프록시를 생성하는 것입니다. belongs_to은 포함되지 않은 연결에만 사용됩니다.

삽입 된 문서를 "멋지게"쿼리 할 수있는 방법이 없습니다. Mongoid는 일반 연합과 마찬가지로 임베디드 어소시에이션을 질의 할 수 있다고 주장하지만 MongoMapper는 가장하는 것을 좋아하지 않습니다. MongoMapper에서 임베디드 문서 배열은 Arraywith very little sugar입니다. MongoDB는 궁극적으로 임베디드 문서의 가상 컬렉션 (number 1 JIRA issue)을 허용 할 수 있으며, 그 시점에서 MM 녀석은 더 멋진 것을 생각할 것입니다.

루비의 열거 가능한 메서드는 매우 유용하여 이 아니기 때문에 자신을 찾는 것이 좋습니다.

user = User.find("1234567abc") 

user.business.select { |b| b.name == target_name }.each { |b| b.address = new_address } 

user.save 
관련 문제