2

我的 Rails 应用程序中有一个深度克隆过程,以及一个递归删除过程,它删除树的节点及其后代及其关联。当 :touch => true 应用于关系时,这两个例程都有问题。当我们只更新一条记录以使更改触及关联和树结构上的所有父记录时很好,但是当我们处理批量创建或删除时,在该调用期间禁用触摸是有意义的。

我正在寻找有关如何定义一个方法的方向,该方法接受一个块以运行不会激活对象上的触摸方法的代码。

我在想也许就在屈服之前我应该​​设置一个全局?指示触摸被禁用的变量,然后覆盖 touch 方法以在调用 super 之前首先检查此变量(或不根据情况而定)。

任何有助于将其固化为实际代码的帮助将不胜感激。:)

4

2 回答 2

2

在 Rails 4.1 或更高版本中,您可以使用 ActiveRecordno_touching方法来防止单个模型或所有模型中的触摸,如下所示:

ActiveRecord::Base.no_touching do
  Project.first.touch  # does nothing
  Message.first.touch  # does nothing
end

Project.no_touching do
  Project.first.touch  # does nothing
  Message.first.touch  # works, but does not touch the associated project
end
于 2020-09-28T02:25:01.630 回答
0

看起来它可能会变得非常棘手,试图想出一种通用的方法。当您声明belongs_to与该:touch选项的关联时,它会为您想要触摸的关联创建一个新方法,如果保存/更新/销毁成功,则该方法会处理触摸。如果您仍想继续前进,请查看add_touch_callbacks,它执行此方法定义和挂钩。

我想我的攻击点是识别正在被触摸的关联,然后用一个空方法覆盖它们的方法定义,让给块,然后将整个覆盖的方法定义放回原位,所以触摸再次起作用。

于 2012-05-07T02:55:37.447 回答