module Shrine::Plugins::Activerecord::AttachmentMethods

Public Instance Methods

included(model) click to toggle source
Calls superclass method
# File lib/shrine/plugins/activerecord.rb, line 20
def included(model)
  super

  return unless model < ::ActiveRecord::Base

  name = @name

  if shrine_class.opts[:activerecord][:validations]
    model.validate do
      send(:"#{name}_attacher").send(:activerecord_validate)
    end
  end

  if shrine_class.opts[:activerecord][:callbacks]
    model.before_save do
      if send(:"#{name}_attacher").changed?
        send(:"#{name}_attacher").send(:activerecord_before_save)
      end
    end

    [:create, :update].each do |action|
      model.after_commit on: action do
        if send(:"#{name}_attacher").changed?
          send(:"#{name}_attacher").send(:activerecord_after_save)
        end
      end
    end

    model.after_commit on: :destroy do
      if send(:"#{name}_attacher").attached?
        send(:"#{name}_attacher").send(:activerecord_after_destroy)
      end
    end
  end

  # reload the attacher on record reload
  define_method :reload do |*args|
    result = super(*args)
    send(:"#{name}_attacher").reload if instance_variable_defined?(:"@#{name}_attacher")
    result
  end
end