Commit 7f724c219bde988682caa4e90ed5f0141bfab2dc
1 parent
321b8e2c
Exists in
master
and in
21 other branches
Use after_commit hook to protect against data inconsistencies - closes #111
Showing
3 changed files
with
39 additions
and
13 deletions
Show diff stats
README.md
@@ -657,25 +657,20 @@ class Product < ActiveRecord::Base | @@ -657,25 +657,20 @@ class Product < ActiveRecord::Base | ||
657 | end | 657 | end |
658 | ``` | 658 | ``` |
659 | 659 | ||
660 | -Reindex conditionally | 660 | +Asynchronous reindexing |
661 | + | ||
662 | +**Note:** Use `after_commit` for ActiveRecord and `after_save` and `after_destroy` for Mongoid | ||
661 | 663 | ||
662 | ```ruby | 664 | ```ruby |
663 | class Product < ActiveRecord::Base | 665 | class Product < ActiveRecord::Base |
664 | searchkick callbacks: false | 666 | searchkick callbacks: false |
665 | 667 | ||
666 | # add the callbacks manually | 668 | # add the callbacks manually |
667 | - after_save :reindex, if: proc{|model| model.name_changed? } # use your own condition | ||
668 | - after_destroy :reindex | ||
669 | -end | ||
670 | -``` | ||
671 | 669 | ||
672 | -Asynchronous reindexing | ||
673 | - | ||
674 | -```ruby | ||
675 | -class Product < ActiveRecord::Base | ||
676 | - searchkick callbacks: false | 670 | + # ActiveRecord - one callback |
671 | + after_commit :reindex_async | ||
677 | 672 | ||
678 | - # add the callbacks manually | 673 | + # Mongoid - two callbacks |
679 | after_save :reindex_async | 674 | after_save :reindex_async |
680 | after_destroy :reindex_async | 675 | after_destroy :reindex_async |
681 | 676 | ||
@@ -686,6 +681,20 @@ class Product < ActiveRecord::Base | @@ -686,6 +681,20 @@ class Product < ActiveRecord::Base | ||
686 | end | 681 | end |
687 | ``` | 682 | ``` |
688 | 683 | ||
684 | +Reindex conditionally | ||
685 | + | ||
686 | +**Note:** Use with caution - (transaction rollbacks can cause data inconstencies)[https://github.com/elasticsearch/elasticsearch-rails/blob/master/elasticsearch-model/README.md#custom-callbacks] with this feature | ||
687 | + | ||
688 | +```ruby | ||
689 | +class Product < ActiveRecord::Base | ||
690 | + searchkick callbacks: false | ||
691 | + | ||
692 | + # add the callbacks manually | ||
693 | + after_save :reindex, if: proc{|model| model.name_changed? } # use your own condition | ||
694 | + after_destroy :reindex | ||
695 | +end | ||
696 | +``` | ||
697 | + | ||
689 | Reindex all models (Rails only) | 698 | Reindex all models (Rails only) |
690 | 699 | ||
691 | ```sh | 700 | ```sh |
lib/searchkick/model.rb
@@ -19,8 +19,12 @@ module Searchkick | @@ -19,8 +19,12 @@ module Searchkick | ||
19 | extend Searchkick::Reindex | 19 | extend Searchkick::Reindex |
20 | include Searchkick::Similar | 20 | include Searchkick::Similar |
21 | 21 | ||
22 | - after_save :reindex, if: proc { self.class.search_callbacks? } | ||
23 | - after_destroy :reindex, if: proc { self.class.search_callbacks? } | 22 | + if respond_to?(:after_commit) |
23 | + after_commit :reindex, if: proc{ self.class.search_callbacks? } | ||
24 | + else | ||
25 | + after_save :reindex, if: proc{ self.class.search_callbacks? } | ||
26 | + after_destroy :reindex, if: proc{ self.class.search_callbacks? } | ||
27 | + end | ||
24 | 28 | ||
25 | def self.enable_search_callbacks | 29 | def self.enable_search_callbacks |
26 | class_variable_set :@@searchkick_callbacks, true | 30 | class_variable_set :@@searchkick_callbacks, true |
test/index_test.rb
@@ -32,4 +32,17 @@ class TestIndex < Minitest::Unit::TestCase | @@ -32,4 +32,17 @@ class TestIndex < Minitest::Unit::TestCase | ||
32 | assert_equal ["Dollar Tree"], Store.search(query: {match: {name: "Dollar Tree"}}).map(&:name) | 32 | assert_equal ["Dollar Tree"], Store.search(query: {match: {name: "Dollar Tree"}}).map(&:name) |
33 | end | 33 | end |
34 | 34 | ||
35 | + if defined?(ActiveRecord) | ||
36 | + | ||
37 | + def test_transaction | ||
38 | + Product.transaction do | ||
39 | + store_names ["Product A"] | ||
40 | + raise ActiveRecord::Rollback | ||
41 | + end | ||
42 | + | ||
43 | + assert_search "product", [] | ||
44 | + end | ||
45 | + | ||
46 | + end | ||
47 | + | ||
35 | end | 48 | end |