У мене є додаток, який оновлює публікацію, якщо вона існує, інакше вона створює нову. Ця публікація містить вбудовані документи:
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 для відповіді № 1Я думаю, що ваш вбудований документ визначений так:
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 не визначає призначення, він не позначає брудний атрибут, а тому не включає його в операцію оновлення.
Перевірте цю теорію, надрукувавши doc.subdoc_changed?
перед збереженням.