События жизненного цикла пользовательских объектов ActiveRecord - PullRequest
0 голосов
/ 06 апреля 2020

В моделях Rails вы можете добавлять различные обратные вызовы до / после для событий, происходящих в жизненном цикле объекта, например, save, update, create и др. c.

I'm Любопытно, есть ли API, который позволяет задавать пользовательские события жизненного цикла и использовать обратные вызовы так же, как со стандартными событиями.

В принципе мне любопытно, как добавить поддержку для чего-то подобного:

class Account < ApplicationRecord
  set_callback(:cancel, :after) { incinerate_later }
end

где cancel - это пользовательское событие.

UPD: я полагаю, что ответ ActiveRecord::Callbacks и ClassMethods.define_callback в частности.

Подробнее об этом здесь: https://api.rubyonrails.org/classes/ActiveSupport/Callbacks/ClassMethods.html#method -i-define_callbacks

Пример из ActionMailbox:

require "active_support/callbacks"

module ActionMailbox
  # Defines the callbacks related to processing.
  module Callbacks
    extend  ActiveSupport::Concern
    include ActiveSupport::Callbacks

    TERMINATOR = ->(mailbox, chain) do
      chain.call
      mailbox.finished_processing?
    end

    included do
      define_callbacks :process, terminator: TERMINATOR, skip_after_callbacks_if_terminated: true
    end

    class_methods do
      def before_processing(*methods, &block)
        set_callback(:process, :before, *methods, &block)
      end

      def after_processing(*methods, &block)
        set_callback(:process, :after, *methods, &block)
      end

      def around_processing(*methods, &block)
        set_callback(:process, :around, *methods, &block)
      end
    end
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...