Skip to content

Commit 11db591

Browse files
committed
Preserve primary key type
1 parent 5c408f1 commit 11db591

File tree

9 files changed

+70
-10
lines changed

9 files changed

+70
-10
lines changed

.rubocop_todo.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ Metrics/MethodLength:
9494
# Offense count: 1
9595
# Configuration parameters: CountComments, CountAsOne.
9696
Metrics/ModuleLength:
97-
Max: 437
97+
Max: 446
9898

9999
# Offense count: 8
100100
# Configuration parameters: IgnoredMethods.

Gemfile

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,11 @@ group :test do
3030
gem 'activerecord-jdbc-adapter', platform: :jruby
3131
gem 'activerecord-jdbcsqlite3-adapter', platform: :jruby
3232
gem 'jdbc-sqlite3', platform: :jruby
33+
gem 'logger'
3334
gem 'rspec', '~> 3.0'
3435
gem 'simplecov', require: 'false'
3536
gem 'simplecov-cobertura', require: 'false'
3637
gem 'threads'
37-
gem 'logger'
3838

3939
gem 'byebug'
4040
gem 'dotenv', '~> 2.7', '>= 2.7.6'

README.md

+15
Original file line numberDiff line numberDiff line change
@@ -369,6 +369,21 @@ end
369369
370370
Check [`ddnexus/pagy`](https://ddnexus.github.io/pagy/extras/meilisearch) for more information.
371371
372+
373+
### Integer primary keys <!-- omit in toc -->
374+
375+
By default, meilisearch-rails will stringify primary keys before sending them to MeiliSearch.
376+
377+
If you would like primary keys to remain as integers, set the `:stringify_primary_keys` to `false` in the configuration file:
378+
379+
```ruby
380+
MeiliSearch::Rails.configuration = {
381+
meilisearch_url: 'YourMeilisearchUrl',
382+
meilisearch_api_key: 'YourMeilisearchAPIKey',
383+
stringify_primary_keys: :false
384+
}
385+
```
386+
372387
#### Deactivate Meilisearch in certain moments
373388

374389
By default, HTTP connections to the Meilisearch URL are always active, but sometimes you want to disable the HTTP requests in a particular moment or environment.<br>

lib/meilisearch-rails.rb

+11-2
Original file line numberDiff line numberDiff line change
@@ -711,7 +711,12 @@ def ms_search(query, params = {})
711711
end
712712

713713
results = json['hits'].map do |hit|
714-
o = results_by_id[hit[ms_pk(meilisearch_options).to_s].to_s]
714+
hit_id = if MeiliSearch::Rails.configuration[:stringify_primary_keys]
715+
hit[ms_pk(meilisearch_options).to_s].to_s
716+
else
717+
hit[ms_pk(meilisearch_options).to_s]
718+
end
719+
o = results_by_id[hit_id]
715720
if o
716721
o.formatted = hit['_formatted']
717722
o
@@ -836,7 +841,11 @@ def ms_configurations
836841
end
837842

838843
def ms_primary_key_of(doc, options = nil)
839-
doc.send(ms_primary_key_method(options)).to_s
844+
if MeiliSearch::Rails.configuration[:stringify_primary_keys]
845+
doc.send(ms_primary_key_method(options)).to_s
846+
else
847+
doc.send(ms_primary_key_method(options))
848+
end
840849
end
841850

842851
def ms_primary_key_changed?(doc, options = nil)

lib/meilisearch/rails/configuration.rb

+5-2
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,16 @@ module MeiliSearch
22
module Rails
33
module Configuration
44
def configuration
5-
raise NotConfigured if @_config.blank?
5+
raise NotConfigured if @_config.blank? || @_config[:meilisearch_api_key].nil?
66

77
@_config
88
end
99

1010
def configuration=(configuration)
11-
@_config = configuration
11+
@_config = {
12+
stringify_primary_keys: true,
13+
**configuration
14+
}
1215
end
1316

1417
def deactivate!

lib/meilisearch/rails/multi_search/result.rb

+16-3
Original file line numberDiff line numberDiff line change
@@ -59,15 +59,28 @@ def load_results(klass, result)
5959

6060
if records.respond_to? :in_order_of
6161
records.in_order_of(condition_key, hits_by_id.keys).each do |record|
62-
record.formatted = hits_by_id[record.send(condition_key).to_s]['_formatted']
62+
record_id = if MeiliSearch::Rails.configuration[:stringify_primary_keys]
63+
record.send(condition_key).to_s
64+
else
65+
record.send(condition_key)
66+
end
67+
record.formatted = hits_by_id[record_id]['_formatted']
6368
end
6469
else
6570
results_by_id = records.index_by do |hit|
66-
hit.send(condition_key).to_s
71+
if MeiliSearch::Rails.configuration[:stringify_primary_keys]
72+
hit.send(condition_key).to_s
73+
else
74+
hit.send(condition_key)
75+
end
6776
end
6877

6978
result['hits'].filter_map do |hit|
70-
record = results_by_id[hit[condition_key.to_s].to_s]
79+
record = if MeiliSearch::Rails.configuration[:stringify_primary_keys]
80+
results_by_id[hit[condition_key.to_s].to_s]
81+
else
82+
results_by_id[hit[condition_key]]
83+
end
7184
record&.formatted = hit['_formatted']
7285
record
7386
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
require 'support/models/color'
2+
require 'support/models/book'
3+
4+
describe 'When primary key is integer' do
5+
it 'stays as integer in index' do
6+
MeiliSearch::Rails.configuration[:stringify_primary_keys] = false
7+
8+
TestUtil.reset_colors!
9+
Color.create!(id: 1, name: 'purple', short_name: 'p')
10+
Color.create!(id: 2, name: 'blue', short_name: 'b')
11+
Color.create!(id: 10, name: 'yellow', short_name: 'l')
12+
raw_search_results = Color.raw_search('*', sort: ['id:asc'])['hits']
13+
raw_search_result_ids = raw_search_results.map { |h| h['id'].to_i }
14+
15+
expect(raw_search_result_ids).to eq [1, 2, 10]
16+
17+
MeiliSearch::Rails.configuration[:stringify_primary_keys] = true
18+
end
19+
end

spec/integration/active_record/record_is_updated_spec.rb

+1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
describe 'When record is updated' do
55
it 'updates the changed attributes on the index' do
6+
TestUtil.reset_colors!
67
purple = Color.create!(name: 'purple', short_name: 'p')
78
expect(Color.search('purple')).to be_one
89
expect(Color.search('pink')).to be_empty

spec/support/models/color.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ class Color < ActiveRecord::Base
1313
meilisearch synchronous: true, index_uid: safe_index_uid('Color') do
1414
searchable_attributes [:name]
1515
filterable_attributes ['short_name']
16-
sortable_attributes [:name]
16+
sortable_attributes %i[id name]
1717
ranking_rules [
1818
'words',
1919
'typo',

0 commit comments

Comments
 (0)