2012-03-30 5 views
3

게시물이있는 경우 해당 게시물을 업데이트하는 앱이 있습니다. 그렇지 않으면 게시물을 새로 만듭니다.몽고/몽고 이드는 모델을 만들지 만 모델을 업데이트하지 않습니다.

class Post 
    embeds_one :tag, :as => :taggable, :class_name => 'TagSnippet' 
end 

class TagSnippet 
    include Mongoid::Document 
    field :name 
    embedded_in :taggable, polymorphic: true 
end 

포스트는 다음 코드를 사용하여 컨트롤러에 업데이트됩니다 :이 게시물에 포함 된 문서에 포함

@post = Post.where(--some criteria which work--).first 
if @post 
    @post.attributes = params 
else 
    @post = Post.new(params) 
end 

@post.save! 

이 코드 실행 및 비 포함 된 문서를 업데이트하지만 포함 된 문서를 업데이트하지 않습니다 . 이상하게도 Rubymine에서 디버깅 할 때 @post의 모든 속성이 적절하게 변경되지만 (포함 된 것도 포함) 데이터베이스는 업데이트되지 않습니다.

이것은 내게 몽고 또는 몽고이 문제이지만, 몽고 및 몽고이 보석을 롤백하면 아무 변화가 없음을 나타냅니다.

답변

3

나는 임베디드 문서는 다음과 같이 정의되어 있는지 추측 :

field :subdoc, type: Hash 

내가 몇 번 이미 부딪쳤다. 짧은 설명 : 몽고 이드는 서브 섀시 내부의 변경 내용을 추적하지 않습니다.

doc.subdoc.field_a = 1 # won't be tracked 

sd = doc.subdoc.dup 
sd.field_a = 1 
doc.subdoc = sd # should be tracked 

따라서 Mongoid가 할당을 검색하지 않으면 더티 (dirty) 속성을 표시하지 않으므로 업데이트 작업에 포함되지 않습니다.

저장하기 전에 doc.subdoc_changed?을 인쇄하여이 이론을 확인하십시오.

+0

실제로 mongoid의 embeds_one/embedded_in을 사용했으며이를 반영하여 답변을 업데이트했습니다. 빠른 답장을 보내 주셔서 감사합니다! –

+0

어쨌든 내 이론이 여전히 유효한지 확인하십시오. –

+0

'@ post.tag_changed? '오류가 발생합니다. '@ post.tag.name_changed?'는'true'를 결과로 가져옵니다. –

관련 문제