Определите, выполняется ли код в определенном блоке

Можно ли определить, выполняется ли код в определенном блоке? Мой пример использования описан ниже с некоторым смешанным псевдокодом, который демонстрирует мою идею. Любые предложения приветствуются! Я хочу, чтобы блок в модели не запускался, когда какое-либо действие в модели вызывается изнутри 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

1 ответ

Пока вы не звоните из нескольких потоков, может что-то вроде этого:

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

Затем в вызовах вашего метода просто проверьте @block_op флаг.

Другие вопросы по тегам