From 10640cac10dfc0db3f546197f1b1d7f398323fdf Mon Sep 17 00:00:00 2001 From: Sean Floyd Date: Fri, 9 Apr 2021 11:58:14 +0200 Subject: [PATCH 1/4] Allow chaining scope or includes when searching across multiple models Must use `klass.name` instead of klass (#912) --- .../lib/elasticsearch/model/adapters/multiple.rb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/elasticsearch-model/lib/elasticsearch/model/adapters/multiple.rb b/elasticsearch-model/lib/elasticsearch/model/adapters/multiple.rb index b4df631f4..4c51fc033 100644 --- a/elasticsearch-model/lib/elasticsearch/model/adapters/multiple.rb +++ b/elasticsearch-model/lib/elasticsearch/model/adapters/multiple.rb @@ -70,6 +70,12 @@ def __records_by_type def __records_for_klass(klass, ids) adapter = __adapter_for_klass(klass) + # Allow calling `.records()` with options: + # klass.name => [{ method: :includes, args: [:association]}, { method: :scope_name }] + if (klass_options = @options.dig(klass.name)) + klass_options.each { klass = klass.public_send(_1[:method], *_1[:args]) } + end + case when Elasticsearch::Model::Adapter::ActiveRecord.equal?(adapter) klass.where(klass.primary_key => ids) From 6633effe7ac1b7fb6aec48242ed2d6e90ad03169 Mon Sep 17 00:00:00 2001 From: Sean Floyd Date: Fri, 9 Apr 2021 12:05:03 +0200 Subject: [PATCH 2/4] Fix for ruby < 2.7 --- .../lib/elasticsearch/model/adapters/multiple.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/elasticsearch-model/lib/elasticsearch/model/adapters/multiple.rb b/elasticsearch-model/lib/elasticsearch/model/adapters/multiple.rb index 4c51fc033..f7ed41708 100644 --- a/elasticsearch-model/lib/elasticsearch/model/adapters/multiple.rb +++ b/elasticsearch-model/lib/elasticsearch/model/adapters/multiple.rb @@ -73,7 +73,7 @@ def __records_for_klass(klass, ids) # Allow calling `.records()` with options: # klass.name => [{ method: :includes, args: [:association]}, { method: :scope_name }] if (klass_options = @options.dig(klass.name)) - klass_options.each { klass = klass.public_send(_1[:method], *_1[:args]) } + klass_options.each { |opts| klass = klass.public_send(opts[:method], *opts[:args]) } end case From 67afff0047f87efeebcfdab1a6290bdaf499b016 Mon Sep 17 00:00:00 2001 From: Sean Floyd Date: Fri, 9 Apr 2021 13:24:38 +0200 Subject: [PATCH 3/4] Fix options --- .../lib/elasticsearch/model/adapters/multiple.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/elasticsearch-model/lib/elasticsearch/model/adapters/multiple.rb b/elasticsearch-model/lib/elasticsearch/model/adapters/multiple.rb index f7ed41708..494a634a2 100644 --- a/elasticsearch-model/lib/elasticsearch/model/adapters/multiple.rb +++ b/elasticsearch-model/lib/elasticsearch/model/adapters/multiple.rb @@ -71,8 +71,8 @@ def __records_for_klass(klass, ids) adapter = __adapter_for_klass(klass) # Allow calling `.records()` with options: - # klass.name => [{ method: :includes, args: [:association]}, { method: :scope_name }] - if (klass_options = @options.dig(klass.name)) + # ex: `klass.name => [{ method: :includes, args: [:association]}, { method: :scope_name }]` + if (klass_options = options&.dig(klass.name)) klass_options.each { |opts| klass = klass.public_send(opts[:method], *opts[:args]) } end From f90a66d5e68ae3cd5ede39355501452ac9eb4eb9 Mon Sep 17 00:00:00 2001 From: Sean Floyd Date: Fri, 9 Apr 2021 13:35:41 +0200 Subject: [PATCH 4/4] Update multiple.rb --- .../lib/elasticsearch/model/adapters/multiple.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/elasticsearch-model/lib/elasticsearch/model/adapters/multiple.rb b/elasticsearch-model/lib/elasticsearch/model/adapters/multiple.rb index 494a634a2..81b9fe61e 100644 --- a/elasticsearch-model/lib/elasticsearch/model/adapters/multiple.rb +++ b/elasticsearch-model/lib/elasticsearch/model/adapters/multiple.rb @@ -72,7 +72,7 @@ def __records_for_klass(klass, ids) # Allow calling `.records()` with options: # ex: `klass.name => [{ method: :includes, args: [:association]}, { method: :scope_name }]` - if (klass_options = options&.dig(klass.name)) + if (klass_options = @options&.dig(klass.name)) klass_options.each { |opts| klass = klass.public_send(opts[:method], *opts[:args]) } end