【问题标题】:Determine if code is being run within a certain block确定代码是否在某个块内运行
【发布时间】:2018-07-11 22:51:14
【问题描述】:

是否可以确定代码是否在某个块内运行?下面描述了我的用例,其中混入了一些伪代码,这证明了我的想法。欢迎任何建议!当从 WatchTower.bulk_operation do; end 中调用模型上的任何操作时,我希望模型上的块不运行。

# watch_tower.rb

module WatchTower
  extend ActiveSupport::Concern

  class_methods do
    def not_safe_for_bulk
      yield if block_given? && # not called from within bulk_operation block
    end
  end

  def self.bulk_operation
    yield if block_given?
  end
end


# Inside some other file, callbacks on number shouldn't run

WatchTower.bulk_operation do
    5.times { Number.create }
end


# Inside some other file, callbacks on number SHOULD run

Number.create


# number.rb

class Number < ActiveRecord::Base
  include WatchTower

  not_safe_for_bulk do
    after_commit :something_destructive
  end
end

【问题讨论】:

  • 您能否设置布尔值并在块中将其设置为 true,并检查该值是否设置为 true,这将是您的块运行的指标。

标签: ruby-on-rails ruby activesupport-concern


【解决方案1】:

只要你不是从多个线程调用,这样的工作是否可行:

def self.bulk_operation
  @block_op = true
  yield if block_given?
  @block_op = false
end

然后在您的方法调用中,只需检查 @block_op 标志。

【讨论】:

  • bulk_operationWatchTower的模块方法。如果没有 WatchTower.instance_variable_get(:@block_op) 的非常紧密的绑定,Number 将无法访问这些实例变量,这也会改变 bulk_operation 的返回值
  • 理论保持不变。我不是为 OP 编写代码,只是展示一个概念。
猜你喜欢
  • 1970-01-01
  • 2021-08-01
  • 1970-01-01
  • 2019-10-17
  • 2018-11-29
  • 1970-01-01
  • 2020-07-15
  • 1970-01-01
  • 2016-05-27
相关资源
最近更新 更多