在ActiveRecord中禁用触摸持续时间

时间:2012-05-04 04:28:50

标签: ruby-on-rails block

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

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

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

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

2 个答案:

答案 0 :(得分:1)

在Rails 4.1或更高版本中,您可以使用ActiveRecord no_touching method来防止在单个模型或所有模型中触摸,例如:

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

答案 1 :(得分:0)

看起来它可能变得非常毛茸茸试图找到一种方法来做到这一点。当您使用belongs_to选项声明:touch关联时,如果save / update / destroy成功,它会为您想要触摸的关联创建一个新方法来处理触摸。如果您仍想继续前进,请查看add_touch_callbacks,它执行此方法定义并挂钩。

我想我的攻击点是识别被触摸的关联,然后用空方法覆盖它们的方法定义,屈服于块,然后整个被覆盖的方法定义被放回原位,所以触摸工作试。