没有STI(单表继承),有没有办法检查是否已创建或更新任何模型,并确定在模型上更改/更新了哪个模型和哪些属性?
即。运行rails服务器的输出显示在DB上运行的所有HTTP流量和查询。出于缓存失效的目的,我正在尝试编写一些需要我知道的代码。
我正在寻找after_create和after_update,而不是在任何一个模型上,我需要在创建和更新后拥有通用,并且能够确定创建或更新了哪个模型。
可以在ActiveRecord中完成吗?如果是这样,怎么样?
答案 0 :(得分:2)
如果您没有更改所有模型的逻辑,那么它不是通用钩子,因此您不希望在ActiveRecord::Base
中执行此操作。像这样的鸭子打字很糟糕。
听起来你有共同的行为,处理它的方式是一个模块(或ActiveSupport::Concern
)。
从here修改的示例(假设您正在运行Rails 3 +)
module MaintainAnInvariant
# common logic goes here
extend ActiveSupport::Concern
included do
after_save :maintain_invariant_i_care_about
end
def maintain_invariant_i_care_about
do_stuff_pending_various_logic
end
end
现在,每个共享此逻辑的类将明确包含它,添加语义值
class OneOfTheModelsWithThisLogic < ActiveRecord::Base
include MaintainAnInvariant
end
class AnotherModelWithCommonLogic < ActiveRecord::Base
include MaintainAnInvariant
end
至于你的其余答案,如何知道改变了什么,你正在寻找ActiveModel::Dirty方法。这些允许您检查模型中的更改内容:
person.name = 'Bill'
person.name_changed? # => false
person.name_change # => nil
person.name = 'Bob'
person.changed # => ["name"]
person.changes # => {"name" => ["Bill", "Bob"]}