Commit 805f7efb02eab3f4831bbb7580b9d8441c02f6f1
Exists in
master
and in
21 other branches
Added ability to temporarily disable callbacks - closes #35
Showing
5 changed files
with
85 additions
and
12 deletions
Show diff stats
CHANGELOG.md
README.md
... | ... | @@ -537,7 +537,7 @@ class Product < ActiveRecord::Base |
537 | 537 | end |
538 | 538 | ``` |
539 | 539 | |
540 | -Turn off callbacks | |
540 | +Turn off callbacks permanently | |
541 | 541 | |
542 | 542 | ```ruby |
543 | 543 | class Product < ActiveRecord::Base |
... | ... | @@ -545,6 +545,15 @@ class Product < ActiveRecord::Base |
545 | 545 | end |
546 | 546 | ``` |
547 | 547 | |
548 | +or temporarily [master branch] | |
549 | + | |
550 | +```ruby | |
551 | +Product.disable_search_callbacks # use Searchkick.disable_callbacks for all models | |
552 | +ExpensiveProductsTask.execute | |
553 | +Product.enable_search_callbacks | |
554 | +Product.reindex | |
555 | +``` | |
556 | + | |
548 | 557 | Eager load associations |
549 | 558 | |
550 | 559 | ```ruby | ... | ... |
lib/searchkick.rb
... | ... | @@ -8,6 +8,22 @@ require "searchkick/model" |
8 | 8 | require "searchkick/tasks" |
9 | 9 | require "searchkick/logger" if defined?(Rails) |
10 | 10 | |
11 | +module Searchkick | |
12 | + @callbacks = true | |
13 | + | |
14 | + def self.enable_callbacks | |
15 | + @callbacks = true | |
16 | + end | |
17 | + | |
18 | + def self.disable_callbacks | |
19 | + @callbacks = false | |
20 | + end | |
21 | + | |
22 | + def self.callbacks? | |
23 | + @callbacks | |
24 | + end | |
25 | +end | |
26 | + | |
11 | 27 | # TODO find better ActiveModel hook |
12 | 28 | ActiveModel::Callbacks.send(:include, Searchkick::Model) |
13 | 29 | ActiveRecord::Base.send(:extend, Searchkick::Model) if defined?(ActiveRecord) | ... | ... |
lib/searchkick/model.rb
... | ... | @@ -8,6 +8,7 @@ module Searchkick |
8 | 8 | class_variable_set :@@searchkick_options, options.dup |
9 | 9 | class_variable_set :@@searchkick_env, ENV["RACK_ENV"] || ENV["RAILS_ENV"] || "development" |
10 | 10 | class_variable_set :@@searchkick_klass, self |
11 | + class_variable_set :@@searchkick_callbacks, options[:callbacks] != false | |
11 | 12 | |
12 | 13 | # set index name |
13 | 14 | # TODO support proc |
... | ... | @@ -18,25 +19,36 @@ module Searchkick |
18 | 19 | extend Searchkick::Reindex |
19 | 20 | include Searchkick::Similar |
20 | 21 | |
22 | + after_save :reindex | |
23 | + after_destroy :reindex | |
24 | + | |
25 | + def self.enable_search_callbacks | |
26 | + class_variable_set :@@searchkick_callbacks, true | |
27 | + end | |
28 | + | |
29 | + def self.disable_search_callbacks | |
30 | + class_variable_set :@@searchkick_callbacks, false | |
31 | + end | |
32 | + | |
33 | + def self.search_callbacks? | |
34 | + class_variable_get(:@@searchkick_callbacks) && Searchkick.callbacks? | |
35 | + end | |
36 | + | |
21 | 37 | def should_index? |
22 | 38 | true |
23 | 39 | end |
24 | 40 | |
25 | 41 | def reindex |
26 | - index = self.class.searchkick_index | |
27 | - if destroyed? or !should_index? | |
28 | - index.remove self | |
29 | - else | |
30 | - index.store self | |
42 | + if self.class.search_callbacks? | |
43 | + index = self.class.searchkick_index | |
44 | + if destroyed? or !should_index? | |
45 | + index.remove self | |
46 | + else | |
47 | + index.store self | |
48 | + end | |
31 | 49 | end |
32 | 50 | end |
33 | 51 | |
34 | - unless options[:callbacks] == false | |
35 | - # TODO ability to temporarily disable | |
36 | - after_save :reindex | |
37 | - after_destroy :reindex | |
38 | - end | |
39 | - | |
40 | 52 | def search_data |
41 | 53 | respond_to?(:to_hash) ? to_hash : serializable_hash |
42 | 54 | end | ... | ... |
... | ... | @@ -0,0 +1,35 @@ |
1 | +require_relative "test_helper" | |
2 | + | |
3 | +class TestModel < Minitest::Unit::TestCase | |
4 | + | |
5 | + def test_disable_callbacks_model | |
6 | + store_names ["product a"] | |
7 | + | |
8 | + Product.disable_search_callbacks | |
9 | + assert !Product.search_callbacks? | |
10 | + | |
11 | + store_names ["product b"] | |
12 | + assert_search "product", ["product a"] | |
13 | + | |
14 | + Product.enable_search_callbacks | |
15 | + Product.reindex | |
16 | + | |
17 | + assert_search "product", ["product a", "product b"] | |
18 | + end | |
19 | + | |
20 | + def test_disable_callbacks_global | |
21 | + store_names ["product a"] | |
22 | + | |
23 | + Searchkick.disable_callbacks | |
24 | + assert !Searchkick.callbacks? | |
25 | + | |
26 | + store_names ["product b"] | |
27 | + assert_search "product", ["product a"] | |
28 | + | |
29 | + Searchkick.enable_callbacks | |
30 | + Product.reindex | |
31 | + | |
32 | + assert_search "product", ["product a", "product b"] | |
33 | + end | |
34 | + | |
35 | +end | ... | ... |