Module: ActiveRecord::Suppressor

Extended by:
ActiveSupport::Concern
Included in:
Base
Defined in:
activerecord/lib/active_record/suppressor.rb

Overview

Active Record Suppressor

ActiveRecord::Suppressor prevents the receiver from being saved during a given block.

For example, here’s a pattern of creating notifications when new comments are posted. (The notification may in turn trigger an email, a push notification, or just appear in the UI somewhere):

class Comment < ActiveRecord::Base
  belongs_to :commentable, polymorphic: true
  after_create -> { Notification.create! comment: self,
    recipients: commentable.recipients }
end

That’s what you want the bulk of the time. New comment creates a new Notification. But there may well be off cases, like copying a commentable and its comments, where you don’t want that. So you’d have a concern something like this:

module Copyable
  def copy_to(destination)
    Notification.suppress do
      # Copy logic that creates new comments that we do not want
      # triggering notifications.
    end
  end
end

Defined Under Namespace

Modules: ClassMethods

Class Method Summary collapse

Instance Method Summary collapse

Methods included from ActiveSupport::Concern

append_features, class_methods, extended, included, prepend_features, prepended

Class Method Details

.registryObject

:nodoc:



36
37
38
# File 'activerecord/lib/active_record/suppressor.rb', line 36

def registry # :nodoc:
  ActiveSupport::IsolatedExecutionState[:active_record_suppressor_registry] ||= {}
end

Instance Method Details

#saveObject

:nodoc:



51
52
53
# File 'activerecord/lib/active_record/suppressor.rb', line 51

def save(**) # :nodoc:
  Suppressor.registry[self.class.name] ? true : super
end

#save!Object

:nodoc:



55
56
57
# File 'activerecord/lib/active_record/suppressor.rb', line 55

def save!(**) # :nodoc:
  Suppressor.registry[self.class.name] ? true : super
end