Skip to content

Commit 3487650

Browse files
authored
Merge pull request #1033 from cerebris/relationship_filter
Rework apply_filter(s) to allow callables to be called for relationship filters
2 parents 3c686c5 + 1ff2e5c commit 3487650

File tree

2 files changed

+19
-12
lines changed

2 files changed

+19
-12
lines changed

lib/jsonapi/active_record_accessor.rb

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,15 @@ def apply_filter(records, filter, value, options = {})
267267
strategy.call(records, value, options)
268268
end
269269
else
270-
records.where(filter => value)
270+
if _resource_klass._relationships.include?(filter)
271+
if _resource_klass._relationships[filter].belongs_to?
272+
records.where(_resource_klass._relationships[filter].foreign_key => value)
273+
else
274+
records.where("#{_resource_klass._relationships[filter].table_name}.#{_resource_klass._relationships[filter].primary_key}" => value)
275+
end
276+
else
277+
records.where(filter => value)
278+
end
271279
end
272280
end
273281

@@ -301,21 +309,16 @@ def apply_filters(records, filters, options = {})
301309

302310
if filters
303311
filters.each do |filter, value|
304-
if _resource_klass._relationships.include?(filter)
305-
if _resource_klass._relationships[filter].belongs_to?
306-
records = apply_filter(records, _resource_klass._relationships[filter].foreign_key, value, options)
307-
else
308-
required_includes.push(filter.to_s)
309-
records = apply_filter(records, "#{_resource_klass._relationships[filter].table_name}.#{_resource_klass._relationships[filter].primary_key}", value, options)
310-
end
311-
else
312-
records = apply_filter(records, filter, value, options)
312+
if _resource_klass._relationships.include?(filter) && !_resource_klass._relationships[filter].belongs_to?
313+
required_includes.push(filter.to_s)
313314
end
315+
316+
records = apply_filter(records, filter, value, options)
314317
end
315318
end
316319

317320
if required_includes.any?
318-
records = apply_includes(records, options.merge(include_directives: IncludeDirectives.new(_resource_klass, required_includes, force_eager_load: true)))
321+
options.merge!(include_directives: IncludeDirectives.new(_resource_klass, required_includes, force_eager_load: true))
319322
end
320323

321324
records

test/fixtures/active_record.rb

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1488,7 +1488,11 @@ class BookResource < JSONAPI::Resource
14881488

14891489
has_many :aliased_comments, class_name: 'BookComments', relation_name: :approved_book_comments
14901490

1491-
filters :book_comments
1491+
filter :book_comments,
1492+
apply: ->(records, value, options) {
1493+
return records.where('book_comments.id' => value)
1494+
}
1495+
14921496
filter :banned, apply: :apply_filter_banned
14931497

14941498
class << self

0 commit comments

Comments
 (0)