/ / Mongo / Mongoid creerà, ma non aggiornerà un modello - ruby-on-rails, mongodb, mongoid

Mongo / Mongoid creerà, ma non aggiornerà un modello - ruby-on-rails, mongodb, mongoid

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 № 1

Immagino 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.