Mongo / Mongoid создаст, но не обновит модель - PullRequest
3 голосов
/ 30 марта 2012

У меня есть приложение, которое обновляет сообщение, если оно существует, в противном случае оно создает новое. Этот пост содержит вложенные документы:

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 меняются соответствующим образом (включая встроенные), но независимо от того, база данных не обновляется.

Это указывает на то, что это какая-то проблема с монго или монгоидом, но откат монго и монгоидных камней не принес изменений.

1 Ответ

3 голосов
/ 30 марта 2012

Полагаю, что ваш встроенный документ определен так:

field :subdoc, type: Hash

Я сталкивался с этим уже пару раз.Краткое объяснение: Mongoid не отслеживает изменения в подшахах.

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

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

Таким образом, если Mongoid не обнаруживает назначения, он не помечает атрибут как грязный и поэтому не включает его в операцию обновления.

Проверьте эту теорию, напечатав doc.subdoc_changed? перед сохранением.

...