1

只有当嵌入的文档字段被更改时,有没有办法运行回调?

目前,只有在普通字段发生更改时,以下内容才会在普通字段上运行回调:

class user
  field :email, type: String
  embeds_many :connections, cascade_callbacks: true
  before_save :run_callback, :if => :email_changed?
  before_save :run_connection_callback, :if => :connections_changed?  # DOES NOT WORK
end
4

2 回答 2

1

对于任何在 2015 年看到这个答案的人

在 Mongoid 4.x model.changed 中?model.changes存在并且表现得像它们的 ActiveRecord 对应物。

于 2015-09-10T14:57:27.580 回答
0

Mongoid 不会connections_changed?为您定义方法,但您可以通过使用虚拟字段来自己定义它,User以跟踪嵌入式连接何时更改。那是:

class User

  # define reader/writer methods for @connections_changed
  attr_accessor :connections_changed

  def connections_changed?
    self.connections_changed
  end

  # the connections are no longer considered changed after the persistence action
  after_save { self.connections_changed = false }

  before_save :run_connection_callback, :if => :connections_changed?

end

class Connection
  embedded_in :user

  before_save :tell_user_about_change, :if => :changed?

  def tell_user_about_change
    user.connections_changed = true
  end
end

此方法的一个缺点是user.connections_changed仅在保存文档时才设置。回调以这样的方式级联,即Connection before_save首先调用回调,然后User before save调用回调,这允许上述代码适用于此用例。但是,如果您需要在调用之前知道任何连接是否发生了变化,则save需要找到另一种方法。

于 2012-10-16T04:37:54.653 回答