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