ActiveRecord创建,更新任何模型

时间:2015-06-10 14:42:01

标签: ruby-on-rails

没有STI(单表继承),有没有办法检查是否已创建或更新任何模型,并确定在模型上更改/更新了哪个模型和哪些属性?

即。运行rails服务器的输出显示在DB上运行的所有HTTP流量和查询。出于缓存失效的目的,我正在尝试编写一些需要我知道的代码。

我正在寻找after_create和after_update,而不是在任何一个模型上,我需要在创建和更新后拥有通用,并且能够确定创建或更新了哪个模型。

可以在ActiveRecord中完成吗?如果是这样,怎么样?

1 个答案:

答案 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"]}