Sha256: 605d1a977bacd5f05775c8845fe04cf46225701c1ecde2ec37e90745a282d3c4
Contents?: true
Size: 1.7 KB
Versions: 20
Compression:
Stored size: 1.7 KB
Contents
module ActiveRecord # 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 module Suppressor extend ActiveSupport::Concern module ClassMethods def suppress(&block) previous_state = SuppressorRegistry.suppressed[name] SuppressorRegistry.suppressed[name] = true yield ensure SuppressorRegistry.suppressed[name] = previous_state end end def save(*) # :nodoc: SuppressorRegistry.suppressed[self.class.name] ? true : super end def save!(*) # :nodoc: SuppressorRegistry.suppressed[self.class.name] ? true : super end end class SuppressorRegistry # :nodoc: extend ActiveSupport::PerThreadRegistry attr_reader :suppressed def initialize @suppressed = {} end end end
Version data entries
20 entries across 20 versions & 1 rubygems