Если это действительно важно для вас, возможно, гораздо более простым решением будет создание собственного метода в классе модели для вызова команды destroy и непосредственного выполнения любых действий по очистке. Эта функция может затем получить дополнительную информацию о вызывающем абоненте. Примерно так может работать:
class Work < ActiveRecord::Base
def destroy_work(from)
self.destroy
Rails.logger.info "The work with the id of #{id} got destroyed by #{from}"
end
end
Не полагаясь на сложное метапрограммирование (например, на проверку стека вызовов), вы делаете свою программу намного более устойчивой, а также намного более легкой для понимания. То же самое относится к обратным вызовам и тем более к классам внешних наблюдателей. В исходной модели обычно присутствуют лишь небольшие следы существования обратных вызовов (если они вообще есть). Это делает анализ поведения очень сложным и подверженным ошибкам, поскольку вы можете легко пропустить потенциально важные части вашей бизнес-логики. Внедряя прямые функции, вы облегчаете понимание своей логики, следуя простой прямой линии.
Если есть сомнения, всегда самая глупая и простая вещь, которая могла бы сработать. Обычно для отладки кода нужно быть в два раза умнее, чем для его написания. Таким образом, выполнение умных вещей в дальнейшем может привести к фактически не поддерживаемому коду, поскольку люди просто не настолько умны, чтобы понимать ваши логические потоки.