meilisearch-rails 0.7.0 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +40 -2
- data/lib/meilisearch/rails/configuration.rb +1 -0
- data/lib/meilisearch/rails/version.rb +5 -1
- data/lib/meilisearch-rails.rb +26 -7
- data/meilisearch-rails.gemspec +1 -1
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2957f44b71394e8f2c6c3e3fa8aa3907b85ef4405c2cbb5230080383eebbe034
|
4
|
+
data.tar.gz: 99ebb927e9194b10746355e5ba3ae44853fa4c1ee2e98f6818e910c073f01b8d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '08834c370f32354ad47eb1d904212e8535a5b47f89a705ad3aeb42bf7a4768b0dd51f4198b86855f3691c886ccac850f9ef88e6528433a90a9774d6d3bacff0c'
|
7
|
+
data.tar.gz: 22ac7b9564df2fef7f23b5227578713d095492f615e9fa652c0d1fb55167d1d9188fda65e4b683db8d413cb38086e27930d1dd6077975b088fd89dfbd1ac8114
|
data/README.md
CHANGED
@@ -30,6 +30,7 @@
|
|
30
30
|
- [📖 Documentation](#-documentation)
|
31
31
|
- [🤖 Compatibility with Meilisearch](#-compatibility-with-meilisearch)
|
32
32
|
- [🚀 Getting Started](#-getting-started)
|
33
|
+
- [Compatibility](#-compatibility)
|
33
34
|
- [⚙️ Settings](#️-settings)
|
34
35
|
- [🔍 Custom search](#-custom-search)
|
35
36
|
- [🪛 Options](#-options)
|
@@ -43,6 +44,7 @@
|
|
43
44
|
- [Relations](#relations)
|
44
45
|
- [Sanitize attributes](#sanitize-attributes)
|
45
46
|
- [UTF-8 encoding](#utf-8-encoding)
|
47
|
+
- [Eager loading](#eager-loading)
|
46
48
|
- [Manual operations](#manual-operations)
|
47
49
|
- [Indexing & deletion](#indexing--deletion)
|
48
50
|
- [Access the underlying index object](#access-the-underlying-index-object)
|
@@ -190,6 +192,10 @@ MeiliSearch::Rails.configuration = {
|
|
190
192
|
}
|
191
193
|
```
|
192
194
|
|
195
|
+
## Compatibility
|
196
|
+
|
197
|
+
If your model already has methods that meilisearch-rails defines such as `search` and `index`, they will not be redefined. You can target the meilisearch-rails-defined methods by prefixing with `ms_`, e.g. `Book.ms_search('harry potter')`.
|
198
|
+
|
193
199
|
## ⚙️ Settings
|
194
200
|
|
195
201
|
You can configure the index settings by adding them inside the `meilisearch` block as shown below:
|
@@ -312,15 +318,33 @@ end
|
|
312
318
|
|
313
319
|
By default, the primary key is based on your record's id. You can change this behavior by specifying the `primary_key:` option.
|
314
320
|
|
315
|
-
Note that the primary key must
|
321
|
+
Note that the primary key must return a **unique value** otherwise your data could be overwritten.
|
316
322
|
|
317
323
|
```ruby
|
318
324
|
class Book < ActiveRecord::Base
|
319
325
|
include MeiliSearch::Rails
|
320
326
|
|
321
|
-
meilisearch primary_key:
|
327
|
+
meilisearch primary_key: :isbn # isbn is a column in your table definition.
|
328
|
+
end
|
329
|
+
```
|
330
|
+
|
331
|
+
You can also set the `primary_key` as a method, this method will be evaluated in runtime, and its return
|
332
|
+
will be used as the reference to the document when Meilisearch needs it.
|
333
|
+
|
334
|
+
```rb
|
335
|
+
class Book < ActiveRecord::Base
|
336
|
+
include MeiliSearch::Rails
|
337
|
+
|
338
|
+
meilisearch primary_key: :my_custom_ms_id
|
339
|
+
|
340
|
+
private
|
341
|
+
|
342
|
+
def my_custom_ms_id
|
343
|
+
"isbn_#{primary_key}" # ensure this return is unique, otherwise you'll lose data.
|
344
|
+
end
|
322
345
|
end
|
323
346
|
```
|
347
|
+
|
324
348
|
#### Conditional indexing
|
325
349
|
|
326
350
|
You can control if a record must be indexed by using the `if:` or `unless:` options.<br>
|
@@ -600,6 +624,20 @@ class Book < ActiveRecord::Base
|
|
600
624
|
end
|
601
625
|
```
|
602
626
|
|
627
|
+
#### Eager loading
|
628
|
+
|
629
|
+
You can eager load associations using `meilisearch_import` scope.
|
630
|
+
|
631
|
+
```ruby
|
632
|
+
class Author < ActiveRecord::Base
|
633
|
+
include MeiliSearch::Rails
|
634
|
+
|
635
|
+
has_many :books
|
636
|
+
|
637
|
+
scope :meilisearch_import, -> { includes(:books) }
|
638
|
+
end
|
639
|
+
```
|
640
|
+
|
603
641
|
### Manual operations
|
604
642
|
|
605
643
|
#### Indexing & deletion
|
data/lib/meilisearch-rails.rb
CHANGED
@@ -233,9 +233,13 @@ module MeiliSearch
|
|
233
233
|
def initialize(index_uid, raise_on_failure, options)
|
234
234
|
client = MeiliSearch::Rails.client
|
235
235
|
primary_key = options[:primary_key] || MeiliSearch::Rails::IndexSettings::DEFAULT_PRIMARY_KEY
|
236
|
-
client.create_index(index_uid, { primaryKey: primary_key })
|
237
|
-
@index = client.index(index_uid)
|
238
236
|
@raise_on_failure = raise_on_failure.nil? || raise_on_failure
|
237
|
+
|
238
|
+
SafeIndex.log_or_throw(nil, @raise_on_failure) do
|
239
|
+
client.create_index(index_uid, { primary_key: primary_key })
|
240
|
+
end
|
241
|
+
|
242
|
+
@index = client.index(index_uid)
|
239
243
|
end
|
240
244
|
|
241
245
|
::MeiliSearch::Index.instance_methods(false).each do |m|
|
@@ -273,7 +277,7 @@ module MeiliSearch
|
|
273
277
|
|
274
278
|
def self.log_or_throw(method, raise_on_failure, &block)
|
275
279
|
yield
|
276
|
-
rescue ::MeiliSearch::ApiError => e
|
280
|
+
rescue ::MeiliSearch::TimeoutError, ::MeiliSearch::ApiError => e
|
277
281
|
raise e if raise_on_failure
|
278
282
|
|
279
283
|
# log the error
|
@@ -609,9 +613,6 @@ module MeiliSearch
|
|
609
613
|
# "processingTimeMs"=>0, "query"=>"iphone"}
|
610
614
|
json = ms_raw_search(query, params)
|
611
615
|
|
612
|
-
# Returns the ids of the hits: 13
|
613
|
-
hit_ids = json['hits'].map { |hit| hit[ms_pk(meilisearch_options).to_s] }
|
614
|
-
|
615
616
|
# condition_key gets the primary key of the document; looks for "id" on the options
|
616
617
|
condition_key = if defined?(::Mongoid::Document) && include?(::Mongoid::Document)
|
617
618
|
ms_primary_key_method.in
|
@@ -619,6 +620,23 @@ module MeiliSearch
|
|
619
620
|
ms_primary_key_method
|
620
621
|
end
|
621
622
|
|
623
|
+
# The condition_key must be a valid column otherwise, the `.where` below will not work
|
624
|
+
# Since we provide a way to customize the primary_key value, `ms_pk(meilisearch_options)` may not
|
625
|
+
# respond with a valid database column. The blocks below prevent that from happening.
|
626
|
+
has_virtual_column_as_pk = if defined?(::Sequel::Model) && self < Sequel::Model
|
627
|
+
meilisearch_options[:type].columns.map(&:to_s).exclude?(condition_key.to_s)
|
628
|
+
else
|
629
|
+
meilisearch_options[:type].columns.map(&:name).map(&:to_s).exclude?(condition_key.to_s)
|
630
|
+
end
|
631
|
+
|
632
|
+
condition_key = meilisearch_options[:type].primary_key if has_virtual_column_as_pk
|
633
|
+
|
634
|
+
hit_ids = if has_virtual_column_as_pk
|
635
|
+
json['hits'].map { |hit| hit[condition_key] }
|
636
|
+
else
|
637
|
+
json['hits'].map { |hit| hit[ms_pk(meilisearch_options).to_s] }
|
638
|
+
end
|
639
|
+
|
622
640
|
# meilisearch_options[:type] refers to the Model name (e.g. Product)
|
623
641
|
# results_by_id creates a hash with the primaryKey of the document (id) as the key and doc itself as the value
|
624
642
|
# {"13"=>#<Product id: 13, name: "iphone", href: "apple", tags: nil, type: nil,
|
@@ -827,7 +845,8 @@ module MeiliSearch
|
|
827
845
|
|
828
846
|
def ms_find_in_batches(batch_size, &block)
|
829
847
|
if (defined?(::ActiveRecord) && ancestors.include?(::ActiveRecord::Base)) || respond_to?(:find_in_batches)
|
830
|
-
|
848
|
+
scope = respond_to?(:meilisearch_import) ? meilisearch_import : all
|
849
|
+
scope.find_in_batches(batch_size: batch_size, &block)
|
831
850
|
elsif defined?(::Sequel::Model) && self < Sequel::Model
|
832
851
|
dataset.extension(:pagination).each_page(batch_size, &block)
|
833
852
|
else
|
data/meilisearch-rails.gemspec
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: meilisearch-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
4
|
+
version: 0.7.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Meili
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-08-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: meilisearch
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 0.19.2
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 0.19.2
|
27
27
|
description: Meilisearch integration for Ruby on Rails. See https://github.com/meilisearch/meilisearch
|
28
28
|
email: bonjour@meilisearch.com
|
29
29
|
executables: []
|