From ef692e0a902bdf0cf2aadc971f64c176527f9e65 Mon Sep 17 00:00:00 2001 From: Jacek Tomaszewski Date: Sun, 22 Dec 2013 02:57:04 +0100 Subject: [PATCH] Add ability to temporarily disable callbacks --- README.md | 10 ++++++++-- lib/searchkick.rb | 1 + lib/searchkick/model.rb | 42 ++++++++++++++++++++++++++++++++---------- lib/searchkick/options.rb | 15 +++++++++++++++ test/model_test.rb | 35 +++++++++++++++++++++++++++++++++++ 5 files changed, 91 insertions(+), 12 deletions(-) create mode 100644 lib/searchkick/options.rb create mode 100644 test/model_test.rb diff --git a/README.md b/README.md index c169ffb..ff59713 100644 --- a/README.md +++ b/README.md @@ -527,13 +527,19 @@ class Product < ActiveRecord::Base end ``` -Turn off callbacks - +Turn off callbacks permanently: ```ruby class Product < ActiveRecord::Base searchkick callbacks: false end ``` +or temporarily: +```ruby +Product.searchkick_disable! # use `Searchkick.disable!` for all models +ExpensiveProductsTask.execute +Product.searchkick_enable! +Product.reindex +``` Eager load associations diff --git a/lib/searchkick.rb b/lib/searchkick.rb index 87a96f2..ce62aac 100644 --- a/lib/searchkick.rb +++ b/lib/searchkick.rb @@ -1,5 +1,6 @@ require "tire" require "searchkick/version" +require "searchkick/options" require "searchkick/reindex" require "searchkick/results" require "searchkick/search" diff --git a/lib/searchkick/model.rb b/lib/searchkick/model.rb index 933512f..32b2ff2 100644 --- a/lib/searchkick/model.rb +++ b/lib/searchkick/model.rb @@ -3,11 +3,13 @@ module Searchkick def searchkick(options = {}) class_eval do - cattr_reader :searchkick_options, :searchkick_env, :searchkick_klass, :searchkick_index + cattr_reader :searchkick_options, :searchkick_env, :searchkick_klass, + :searchkick_index class_variable_set :@@searchkick_options, options.dup class_variable_set :@@searchkick_env, ENV["RACK_ENV"] || ENV["RAILS_ENV"] || "development" class_variable_set :@@searchkick_klass, self + class_variable_set :@@searchkick_enabled, false # set index name # TODO support proc @@ -18,19 +20,39 @@ module Searchkick extend Searchkick::Reindex include Searchkick::Similar - def reindex - index = self.class.searchkick_index - if destroyed? - index.remove self - else - index.store self + def self.searchkick_enable! + unless class_variable_get(:@@searchkick_enabled) + class_variable_set :@@searchkick_enabled, true + after_save :reindex + after_destroy :reindex + end + end + + def self.searchkick_disable! + if class_variable_get(:@@searchkick_enabled) + class_variable_set :@@searchkick_enabled, false + skip_callback :save, :after, :reindex + skip_callback :destroy, :after, :reindex end end + def self.searchkick_enabled? + !!class_variable_get(:@@searchkick_enabled) && Searchkick.enabled? + end + unless options[:callbacks] == false - # TODO ability to temporarily disable - after_save :reindex - after_destroy :reindex + self.searchkick_enable! + end + + def reindex + if self.class.searchkick_enabled? + index = self.class.searchkick_index + if destroyed? + index.remove self + else + index.store self + end + end end def search_data diff --git a/lib/searchkick/options.rb b/lib/searchkick/options.rb new file mode 100644 index 0000000..5582c85 --- /dev/null +++ b/lib/searchkick/options.rb @@ -0,0 +1,15 @@ +module Searchkick + @enabled = true + + def self.enable! + @enabled = true + end + + def self.disable! + @enabled = false + end + + def self.enabled? + !!@enabled + end +end diff --git a/test/model_test.rb b/test/model_test.rb new file mode 100644 index 0000000..c9588df --- /dev/null +++ b/test/model_test.rb @@ -0,0 +1,35 @@ +require_relative "test_helper" + +class TestModel < Minitest::Unit::TestCase + + def test_searchkick_disable + store_names ["product a"] + + Product.searchkick_disable! + assert !Product.searchkick_enabled?, 'searchkick has been disabled' + + store_names ["product b"] + assert_search "product", ["product a"] + + Product.searchkick_enable! + Product.reindex + + assert_search "product", ["product a", "product b"] + end + + def test_global_searchkick_disable + store_names ["product a"] + + Searchkick.disable! + assert !Searchkick.enabled?, 'searchkick has been disabled' + + store_names ["product b"] + assert_search "product", ["product a"] + + Searchkick.enable! + Product.reindex + + assert_search "product", ["product a", "product b"] + end + +end -- libgit2 0.21.0