Commit 9cd93e5398dffea302acfb0e9f74668054bbc1bf
Exists in
master
and in
21 other branches
Merge branch 'activejob'
Showing
10 changed files
with
79 additions
and
4 deletions
Show diff stats
CHANGELOG.md
Gemfile
README.md
... | ... | @@ -343,7 +343,7 @@ There are three strategies for keeping the index synced with your database. |
343 | 343 | end |
344 | 344 | ``` |
345 | 345 | |
346 | - Supports [Delayed Job](https://github.com/collectiveidea/delayed_job) only at the moment | |
346 | + And [install Active Job](https://github.com/ankane/activejob_backport) for Rails 4.1 and below | |
347 | 347 | |
348 | 348 | 3. Manual |
349 | 349 | ... | ... |
gemfiles/mongoid4.gemfile
lib/searchkick.rb
... | ... | @@ -12,6 +12,14 @@ require "searchkick/model" |
12 | 12 | require "searchkick/tasks" |
13 | 13 | require "searchkick/logging" if defined?(Rails) |
14 | 14 | |
15 | +# background jobs | |
16 | +begin | |
17 | + require "active_job" | |
18 | +rescue LoadError | |
19 | + # do nothing | |
20 | +end | |
21 | +require "searchkick/reindex_v2_job" if defined?(ActiveJob) | |
22 | + | |
15 | 23 | module Searchkick |
16 | 24 | class MissingIndexError < StandardError; end |
17 | 25 | class UnsupportedVersionError < StandardError; end | ... | ... |
lib/searchkick/model.rb
... | ... | @@ -33,7 +33,11 @@ module Searchkick |
33 | 33 | include Searchkick::Similar |
34 | 34 | |
35 | 35 | def reindex_async |
36 | - Delayed::Job.enqueue Searchkick::ReindexJob.new(self.class.name, id) | |
36 | + if defined?(Searchkick::ReindexV2Job) | |
37 | + Searchkick::ReindexV2Job.perform_later(self.class.name, id.to_s) | |
38 | + else | |
39 | + Delayed::Job.enqueue Searchkick::ReindexJob.new(self.class.name, id.to_s) | |
40 | + end | |
37 | 41 | end |
38 | 42 | |
39 | 43 | if callbacks | ... | ... |
... | ... | @@ -0,0 +1,24 @@ |
1 | +module Searchkick | |
2 | + class ReindexV2Job < ActiveJob::Base | |
3 | + queue_as :searchkick | |
4 | + | |
5 | + def perform(klass, id) | |
6 | + model = klass.constantize | |
7 | + record = model.find(id) rescue nil # TODO fix lazy coding | |
8 | + index = model.searchkick_index | |
9 | + if !record or !record.should_index? | |
10 | + # hacky | |
11 | + record ||= model.new | |
12 | + record.id = id | |
13 | + begin | |
14 | + index.remove record | |
15 | + rescue Elasticsearch::Transport::Transport::Errors::NotFound | |
16 | + # do nothing | |
17 | + end | |
18 | + else | |
19 | + index.store record | |
20 | + end | |
21 | + end | |
22 | + | |
23 | + end | |
24 | +end | ... | ... |
test/reindex_job_test.rb
... | ... | @@ -15,7 +15,7 @@ class TestReindexJob < Minitest::Test |
15 | 15 | product = Product.create!(name: "Boom") |
16 | 16 | Product.searchkick_index.refresh |
17 | 17 | assert_search "*", [] |
18 | - Searchkick::ReindexJob.new("Product", product.id).perform | |
18 | + Searchkick::ReindexJob.new("Product", product.id.to_s).perform | |
19 | 19 | Product.searchkick_index.refresh |
20 | 20 | assert_search "*", ["Boom"] |
21 | 21 | end |
... | ... | @@ -25,7 +25,7 @@ class TestReindexJob < Minitest::Test |
25 | 25 | Product.reindex |
26 | 26 | assert_search "*", ["Boom"] |
27 | 27 | product.destroy |
28 | - Searchkick::ReindexJob.new("Product", product.id).perform | |
28 | + Searchkick::ReindexJob.new("Product", product.id.to_s).perform | |
29 | 29 | Product.searchkick_index.refresh |
30 | 30 | assert_search "*", [] |
31 | 31 | end | ... | ... |
... | ... | @@ -0,0 +1,34 @@ |
1 | +require_relative "test_helper" | |
2 | + | |
3 | +class TestReindexV2Job < Minitest::Test | |
4 | + | |
5 | + def setup | |
6 | + skip if !defined?(ActiveJob) | |
7 | + super | |
8 | + Searchkick.disable_callbacks | |
9 | + end | |
10 | + | |
11 | + def teardown | |
12 | + Searchkick.enable_callbacks | |
13 | + end | |
14 | + | |
15 | + def test_create | |
16 | + product = Product.create!(name: "Boom") | |
17 | + Product.searchkick_index.refresh | |
18 | + assert_search "*", [] | |
19 | + Searchkick::ReindexV2Job.perform_later("Product", product.id.to_s) | |
20 | + Product.searchkick_index.refresh | |
21 | + assert_search "*", ["Boom"] | |
22 | + end | |
23 | + | |
24 | + def test_destroy | |
25 | + product = Product.create!(name: "Boom") | |
26 | + Product.reindex | |
27 | + assert_search "*", ["Boom"] | |
28 | + product.destroy | |
29 | + Searchkick::ReindexV2Job.perform_later("Product", product.id.to_s) | |
30 | + Product.searchkick_index.refresh | |
31 | + assert_search "*", [] | |
32 | + end | |
33 | + | |
34 | +end | ... | ... |
test/test_helper.rb