ActiveRecord自定义对象生命周期事件

时间:2020-04-06 16:19:27

标签: ruby-on-rails activerecord

在Rails模型中,您可以为对象生命周期内发生的事件添加各种之前/之后的回调。 saveupdatecreate

我很好奇,是否有一个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

0 个答案:

没有答案
相关问题