0

我有模型:

class MyModel
    include Mongoid::Document

    after_save :my_callback, if: -> { name_changed? }

    field :name, type: String

    def my_callback
       # this will execute two times
       puts 'executes my callback'
       puts changes
    end
end

想象一下,如果执行以下代码,当变量ab接收相同的文档并且函数update!使用相同的参数执行时name: 'foo'。因此,在第一次更新中my_callback应该调用该函数,但在第二次更新中不应该调用。

MyModel.create(name: 'bar')
a = MyModel.last
b = MyModel.last

a.update!(name: 'foo')
executes my callback
{"name"=>['bar', 'foo']}
=> true

b.update!(name: 'foo')
executes my callback -> this not can execute
{"name"=>['bar', 'foo']}
=> true

如何防止该功能my_callback在第二次更新中运行?

4

1 回答 1

0

脏跟踪(foo_changed?方法)完全在客户端执行。

以下创建两个单独的模型对象:

a = MyModel.last
b = MyModel.last

当您更新a时,应用程序不知道ab引用数据库中的相同文档。就应用程序而言,在a.update!调用之后,b仍然具有原始值name(您可以验证)。

因此,当您发出 时,存储在中b.update!的值更改,并调用您的回调。name b

要查明数据库中的值是否更改,您可以使用例如条件更新。[enter link description here][1]

于 2020-10-26T00:27:42.877 回答