diff --git a/CHANGELOG.md b/CHANGELOG.md index 8f8f87c..8eae0fe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ ## 3.1.2 [unreleased] - Fixed deletes with routing and `async` callbacks +- Fixed deletes with routing and `queue` callbacks ## 3.1.1 diff --git a/lib/searchkick/process_batch_job.rb b/lib/searchkick/process_batch_job.rb index 3f134ce..af42226 100644 --- a/lib/searchkick/process_batch_job.rb +++ b/lib/searchkick/process_batch_job.rb @@ -3,6 +3,10 @@ module Searchkick queue_as { Searchkick.queue_name } def perform(class_name:, record_ids:) + # separate routing from id + routing = Hash[record_ids.map { |r| r.split("|", 2) }] + record_ids = routing.keys + klass = class_name.constantize scope = Searchkick.load_records(klass, record_ids) scope = scope.search_import if scope.respond_to?(:search_import) @@ -10,7 +14,16 @@ module Searchkick # determine which records to delete delete_ids = record_ids - records.map { |r| r.id.to_s } - delete_records = delete_ids.map { |id| m = klass.new; m.id = id; m } + delete_records = delete_ids.map do |id| + m = klass.new + m.id = id + if routing[id] + m.define_singleton_method(:search_routing) do + routing[id] + end + end + m + end # bulk reindex index = klass.searchkick_index diff --git a/lib/searchkick/record_indexer.rb b/lib/searchkick/record_indexer.rb index 4f84bee..9f3054c 100644 --- a/lib/searchkick/record_indexer.rb +++ b/lib/searchkick/record_indexer.rb @@ -20,7 +20,14 @@ module Searchkick raise Searchkick::Error, "Partial reindex not supported with queue option" end - index.reindex_queue.push(record.id.to_s) + # always pass routing in case record is deleted + # before the queue job runs + if record.respond_to?(:search_routing) + routing = record.search_routing + end + + value = [record.id.to_s, routing].join("|") + index.reindex_queue.push(value) when :async unless defined?(ActiveJob) raise Searchkick::Error, "Active Job not found" diff --git a/test/routing_test.rb b/test/routing_test.rb index ad5c820..ecbb589 100644 --- a/test/routing_test.rb +++ b/test/routing_test.rb @@ -31,7 +31,7 @@ class RoutingTest < Minitest::Test end def test_routing_queue - skip # unless defined?(ActiveJob) && defined?(Redis) + skip unless defined?(ActiveJob) && defined?(Redis) with_options(Song, routing: true, callbacks: :queue) do store_names ["Dollar Tree"], Song -- libgit2 0.21.0