Sha256: d5f40afb03f873791e74e2f45221978da82a4b108a70f225ec5e17827250d68b

Contents?: true

Size: 1.5 KB

Versions: 2

Compression:

Stored size: 1.5 KB

Contents

module Tire
  module Model
    module AsyncCallbacks

      ID_CONVERSION = {
          'Moped::BSON::ObjectId' => :to_s
      }

      def self.included(base)
        # Bind after save or create callback
        if base.respond_to? :after_commit
          base.send :after_commit, :async_tire_save_index

        elsif base.respond_to? :after_save
          base.send :after_save, :async_tire_save_index
        end

        # Bind before destroy callback
        if base.respond_to? :before_destroy
          base.send :before_destroy, :async_tire_delete_index
        end
      end

      private

      def async_tire_save_index
        async_tire_callback :update
      end

      def async_tire_delete_index
        async_tire_callback :delete
      end

      def async_tire_callback(type)
        case TireAsyncIndex.engine
          when :sidekiq
            TireAsyncIndex::Workers::SidekiqUpdateIndex.
              perform_async type, self.class.name, async_tire_object_id

          when :resque
            Resque.enqueue TireAsyncIndex::Workers::ResqueUpdateIndex,
              type, self.class.name, async_tire_object_id

          else
            case type
              when :update
                tire.update_index
              when :delete
                tire.index.remove self
            end
        end
      end

      def async_tire_object_id
        if (method = ID_CONVERSION[self.id.class.name])
          self.id.send(method)
        else
          self.id
        end
      end

    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
tire_async_index-0.2.1 lib/tire/model/async_callbacks.rb
tire_async_index-0.2.0 lib/tire/model/async_callbacks.rb