2012-03-30 19 views
3

投稿があればそれを更新するアプリがあります。それ以外の場合は新しいものを作成します。この投稿は、埋め込まれた文書が含まれていますMongo/Mongoidはモデルを作成しますが、モデルを更新しません

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'になります。そうすれば、それは他のものかもしれません。 –

関連する問題