Обратные вызовы mongoid вызываются дважды во встроенном объекте второго уровня

Я работаю со встроенной коллекцией второго уровня в монго. Следующий код показывает базовую структуру того, что у меня есть:

class Parent
  include Mongoid::Document
  include Mongoid::Timestamps
  include Mongoid::Paperclip

  embeds_one :child, class_name: 'Parent::Child', cascade_callbacks: true
  after_update :parent_log_changes
end

class Parent
  class Child
    include Mongoid::Document
    embedded_in :parent, inverse_of: :child
    embeds_one :grand_child, class_name: 'Parent::GrandChild', cascade_callbacks: true
  end
end


class Parent
  class GrandChild
    include Mongoid::Document
    field :enable, type: Boolean, default: true
    embedded_in :child, class_name: 'Parent::Child'

    after_update :grand_child_log_changes
  end
end

Идея кода заключается в том, чтобы иметь возможность регистрировать изменения, примененные к родителю, с помощью функции parent_log_changes.

То же самое для GrandChild, когда он сохранен, код должен обновить изменения через функцию grand_child_log_changes.

Итак, в контроллере у меня есть:

class ParentsController < ApplicationController
  before_action :load_parent
  def grand_child_update
    @parent.child.grand_child.enable = true
    flash[:notice] = 'Successfully updated' if @parent.save
  end
end

Когда выполняется @ parent.save, выполняются обратные вызовы GrandChild.

Проблема в том, что grand_child_log_changes вызывается дважды, создавая дополнительную запись в журнале.

Я предполагаю, что проблема в том, что cascade_callbacks: true установлен как в Parent, так и в Child, но это единственный способ вызвать изменения из @ parent.save.

Другая полезная информация: версия Mongo: v3.2.9 версия Mongoid: 5.1.6 версия Rails: 4.2.5.2

0 ответов

Другие вопросы по тегам