Ho un'app che aggiorna un post se esiste, altrimenti ne crea uno nuovo. Questo post contiene documenti incorporati:
class Post
embeds_one :tag, :as => :taggable, :class_name => "TagSnippet"
end
class TagSnippet
include Mongoid::Document
field :name
embedded_in :taggable, polymorphic: true
end
Il post è aggiornato in un controller con il seguente codice:
@post = Post.where(--some criteria which work--).first
if @post
@post.attributes = params
else
@post = Post.new(params)
end
@post.save!
Questo codice esegue e aggiorna i documenti non incorporati, ma non aggiorna i documenti incorporati. Stranamente, quando eseguo il debug in Rubymine, tutti gli attributi di @post
cambiare in modo appropriato (compresi quelli incorporati), ma indipendentemente dal database non viene aggiornato.
Questo mi indica che si tratta di un problema mongolo o mongolo, ma il ritorno delle gemme mongo e mongolo non ha prodotto alcun cambiamento.
risposte:
3 per risposta № 1Immagino che il tuo documento incorporato sia definito in questo modo:
field :subdoc, type: Hash
Mi sono imbattuto in questo già un paio di volte. Breve spiegazione: Mongoid non tiene traccia dei cambiamenti all'interno dei subhashes.
doc.subdoc.field_a = 1 # won"t be tracked
sd = doc.subdoc.dup
sd.field_a = 1
doc.subdoc = sd # should be tracked
Quindi, se Mongoid non rileva i compiti, non contrassegna l'attributo sporco e quindi non lo include nell'operazione di aggiornamento.
Controlla questa teoria stampando doc.subdoc_changed?
prima di salvare.