ruby-on-rails - 在 ActiveRecord 中的 block 持续时间内禁用触摸

标签 ruby-on-rails block

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

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

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

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

最佳答案

在 Rails 4.1 或更高版本中,您可以使用 ActiveRecord no_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

关于ruby-on-rails - 在 ActiveRecord 中的 block 持续时间内禁用触摸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10442725/

相关文章:

ruby - 如何在 Ruby 的 block 中动态包装代码?

Ruby:Module、Mixins 和 Blocks 令人困惑?

ruby-on-rails - Rspec 3 如何测试 flash 消息

ruby-on-rails - 最简单的文件服务方式 - Ruby on Rails

ruby-on-rails - 是否可以在工厂 (FactoryGirl) 中使用 if 语句?

Ruby:产量在可枚举范围内

ruby-on-rails - 如何在哈希中获取最小键值对

ruby-on-rails - 我应该使用什么样的数据模型来存储历史数据?

c++ - 停止我的应用程序的两个实例同时写入同一个文件夹

objective-c - iOS block 对象不复制?