2013-03-26 1 views
0

최근 몽고이 3.1에서 3.0.3으로 업데이트되었으며 이로 인해 내 편이 코드와 혼동을 일으켰습니다. 내 API에서몽고 이드 3.1 로딩, json 및 필드 이름을 열망합니다.

b = Band.new 
b.name = "Sonny and Cher" 
b.members << Member.new(name: "Sonny") 
b.members << Member.new(name: "Cher") 
b.save 

나는 것 :

class Band 
    include Mongoid::Document 
    field :name, type: String 
    has_many :members, :autosave => true 
end 

class Member 
    include Mongoid::Document 
    field :name, type: String 
    belongs_to :band 
end 

은과 같이 데이터베이스에 모든 것을 저장 :

은 당신이 그렇게처럼 belongs_to/has_many 관계와 한 쌍의 클래스를 가지고 말 다음과 같이 '구성원'개체를 반환 할 수 있습니다.

m = Member.where(name: "Sonny").first 
m.to_json 

예상대로 다음을 산출합니다.

{"_id":"<removed>","band_id":"5151d89f5dd99dd9ec000002","name":"Sonny"} 

내 클라이언트는 원할 경우 후속 통화로 전체 밴드 개체를 요청할 수 있습니다. 그러나 어떤 경우에는 참조 된 항목을 직접 포함하고자합니다. 3.0.3을 사용하면 다음을 수행 할 수 있습니다.

m = Member.where(name: "Sonny").first 
m[:band] = m.band 
m.to_json 

이 경우 전체 대역 정보가 포함 된 새로운 필드가 추가됩니다. 3.1 그러나 (그 이전 버전에서 시작 모르지만, 내가 테스트하지 않았다), 지금이 얻을 : 밴드 정보가 필드에-열망로드 된 것처럼

{"_id":"<removed>","band_id":{"_id":"5151dc025dd99d579e000002","name":"Sonny and Cher"},"name":"Sonny"} 

그래서, 그것은 보인다? 왜 ': band_id'가 아니라 ': band'라는 키 아래에 저장됩니까? 나는 ': band'가 보호되어 있다고 생각하지만 여전히 데이터가 ': band_id'키 아래에 저장되어야한다고 생각하지 않습니다. 나는 여기서 무언가를 놓치고 있다고 생각한다. 어떤 아이디어?

답변

1

은 당신과 같이 to_json에 대한 :include 옵션을 지정할 수 있습니다

m.to_json(include: :band) 

json으로 다음 여전히 존재합니다 JSON과 band_id로 변환 밴드 객체와 키 band있을 것이다.

+0

감사합니다. 확실히 작동합니다. 나는 JSONP (Sinatra에서)를 사용하는 경우 그것을 적응시키는 방법을 찾아야 할 것이다. 나는 아직도 기본 Mongoid 행동에 혼란 스럽다. 객체로 band_id를 채우는 것은 나에게 상처를 주었다. – Exocentric