1

在测试acts_as_audited时,我发现(也如此处所述 :with_associations 标志不会为HABTM 关系生成审计表条目。

例如:

User < ActiveRecord::Base
  has_and_belongs_to_many: :groups
  acts_as_audited, with_associations: groups

Group < ActiveRecord::Base
  has_and_belongs_to_many: :users
  acts_as_audited, with_associations: users

(以及经过测试的变体,即有/无 with_associations)

在源代码中,可以看到所有acts_as_audited 所做的只是将诸如 before_update 和 after_create 之类的回调添加到已审核的表中。显然这些没有添加到连接表中。

我尝试制作如下模型:

GroupsUsers < ActiveRecord::Base
  acts_as_audited

  after_save: :test

  def test
    logger.debug "test"
  end

但没有看到对用户或组的 CRUD 操作的审计表有任何添加。我可以在日志中看到作用于连接表的 SQL 语句,因此这表明连接表在内部以绕过正常回调的方式进行了更改。

这是真的?关于让acts_as_audited 注意到连接表或记录HABTM 关联的任何建议?

4

1 回答 1

1

关联回调has_and_belongs_to_many

与挂钩到 Active Record 对象生命周期的正常回调类似,您还可以定义在向关联集合中添加对象或从关联集合中删除对象时触发的回调。

class Project
  has_and_belongs_to_many :developers, after_add: :evaluate_velocity

  def evaluate_velocity(developer)
    ...
  end
end

可以通过将回调作为数组传递来堆叠回调。例子:

class Project
  has_and_belongs_to_many :developers,
                          after_add: [:evaluate_velocity, Proc.new { |p, d| p.shipping_date = Time.now}]
end

可能的回调是:before_add、、after_add和。before_removeafter_remove

如果任何before_add回调抛出异常,该对象将不会被添加到集合中。

同样,如果任何before_remove回调抛出异常,则不会从集合中删除该对象。

于 2017-04-20T14:02:36.700 回答