Skip to content

Commit 069c647

Browse files
authored
fix(search): prevent nil error in field selection during search (#739)
close #738
1 parent 991d314 commit 069c647

File tree

3 files changed

+29
-11
lines changed

3 files changed

+29
-11
lines changed

app/services/forest_liana/has_many_getter.rb

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,8 @@ def compute_includes
6262
end
6363

6464
def field_names_requested
65-
return nil unless @params[:fields] && @params[:fields][@collection_name]
66-
@params[:fields][@collection_name].split(',')
67-
.map { |name| name.to_sym }
65+
fields = @params.dig(:fields, @collection_name)
66+
Array(fields&.split(',')).map(&:to_sym)
6867
end
6968

7069
def model_association

app/services/forest_liana/resources_getter.rb

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ def self.get_ids_from_request(params, user)
3232
def perform
3333
polymorphic_association, preload_loads = analyze_associations(@resource)
3434
includes = @includes.uniq - polymorphic_association - preload_loads - @optional_includes
35-
has_smart_fields = @params[:fields][@collection_name].split(',').any? do |field|
35+
has_smart_fields = Array(@params.dig(:fields, @collection_name)&.split(',')).any? do |field|
3636
ForestLiana::SchemaHelper.is_smart_field?(@resource, field)
3737
end
3838

@@ -143,10 +143,8 @@ def compute_includes
143143
includes = associations_has_one.map do |association|
144144
association_name = association.name.to_s
145145

146-
if @params[:fields].key?(association_name) &&
147-
@params[:fields][association_name].split(',').size == 1 &&
148-
@params[:fields][association_name].split(',').include?(association.klass.primary_key)
149-
146+
fields = @params[:fields]&.[](association_name)&.split(',')
147+
if fields&.size == 1 && fields.include?(association.klass.primary_key)
150148
@field_names_requested << association.foreign_key
151149
@optional_includes << association.name
152150
end
@@ -191,7 +189,7 @@ def get_segment
191189
end
192190

193191
def field_names_requested
194-
return nil unless @params[:fields] && @params[:fields][@collection_name]
192+
return [] unless @params.dig(:fields, @collection_name)
195193

196194
associations_for_query = extract_associations_from_filter
197195
associations_for_query << @params[:sort].split('.').first.to_sym if @params[:sort]&.include?('.')
@@ -332,11 +330,12 @@ def compute_select_fields
332330
select << "#{@resource.table_name}.#{association.foreign_key}"
333331
end
334332

335-
if @params[:fields].key?(path)
333+
fields = @params[:fields]&.[](path)&.split(',')
334+
if fields
336335
association = get_one_association(path)
337336
table_name = association.table_name
338337

339-
@params[:fields][path].split(',').each do |association_path|
338+
fields.each do |association_path|
340339
if ForestLiana::SchemaHelper.is_smart_field?(association.klass, association_path)
341340
association.klass.attribute_names.each { |attribute| select << "#{table_name}.#{attribute}" }
342341
else

spec/services/forest_liana/resources_getter_spec.rb

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -572,6 +572,26 @@ def association_connection.current_database
572572
expect(records.second.name).to eq 'Treasure'
573573
end
574574
end
575+
576+
describe '#perform' do
577+
let(:resource) { User }
578+
let(:fields) { nil }
579+
let(:sort) { nil }
580+
let(:filters) { nil }
581+
582+
it 'does not raise an error when params[:fields] is nil' do
583+
expect {
584+
getter.perform
585+
}.not_to raise_error
586+
587+
records = getter.records
588+
count = getter.count
589+
590+
expect(records).to all(be_a(User))
591+
expect(count).to eq User.count
592+
end
593+
end
594+
575595
end
576596
end
577597
end

0 commit comments

Comments
 (0)