2012-03-30 9 views
3

Ich habe eine App, die einen Beitrag aktualisiert, wenn es existiert, andernfalls erstellt es einen neuen. Dieser Beitrag enthält eingebettete Dokumente:Mongo/Mongoid wird ein Modell erstellen, aber nicht aktualisieren

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

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

Der Pfosten ist in einer Steuerung mit dem folgenden Code aktualisiert:

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

@post.save! 

Dieser Code läuft und aktualisiert die nicht eingebetteten Dokumente, aber die eingebetteten Dokumente nicht aktualisiert . Seltsamerweise, wenn ich in Rubymine debugge, ändern sich alle Attribute der @post entsprechend (einschließlich der eingebetteten), aber unabhängig von der Datenbank wird nicht aktualisiert.

Das deutet darauf hin, dass es ein Mongo- oder Mongoid-Problem ist, aber das Zurückrollen von Mongo- und Mongoid-Edelsteinen ergab keine Veränderung.

Antwort

3

Ich denke, dass Ihr eingebettetes Dokument wie folgt definiert ist:

field :subdoc, type: Hash 

ich in diesen ein paar Mal schon gestoßen. Kurze Erklärung: Mongoid verfolgt keine Änderungen in Subhashs. So

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

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

, wenn Mongoid keine Zuweisungen erkennen, es markiert nicht schmutzig Attribut, und daher nicht enthalten in der Update-Vorgang.

Überprüfen Sie diese Theorie, indem Sie vor dem Speichern doc.subdoc_changed? drucken.

+0

Ich benutzte tatsächlich Mongoids embeds_one/embedded_in, und ich habe meine Antwort aktualisiert, um das zu reflektieren. Danke für die schnelle Antwort! –

+0

Wie auch immer, überprüfen Sie, ob meine Theorie noch gilt. –

+0

'@ post.tag_changed?' Führt zu einem Fehler. '@ post.tag.name_changed?' führt zu 'true', so dass es aussieht, als könnte es etwas anderes sein. –

Verwandte Themen