From 4f494a406df4d94d99b585e02aff1f6d2004fe49 Mon Sep 17 00:00:00 2001 From: John Griffin Date: Fri, 5 Jun 2015 09:27:41 -0400 Subject: [PATCH] Provide options context to apply_filter Overriding apply_filter is the recommended way to implement custom filters. However if filtering relies on the context (e.g. current_user) it was not possible to implement the custom filter. This passes the options context to the apply_filter method so it is available when overriding in a resource. --- README.md | 2 +- lib/jsonapi/resource.rb | 14 +++++++------- test/unit/resource/resource_test.rb | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index bbaf7d8fa..9d91ba0ed 100644 --- a/README.md +++ b/README.md @@ -358,7 +358,7 @@ control over how the filters are applied to the `Arel` relation. This example shows how you can implement different approaches for different filters. ```ruby -def self.apply_filter(records, filter, value) +def self.apply_filter(records, filter, value, options) case filter when :visibility records.where('users.publicly_visible = ?', value == :public) diff --git a/lib/jsonapi/resource.rb b/lib/jsonapi/resource.rb index 042334006..32a888d33 100644 --- a/lib/jsonapi/resource.rb +++ b/lib/jsonapi/resource.rb @@ -326,11 +326,11 @@ def apply_sort(records, order_options) end end - def apply_filter(records, filter, value) + def apply_filter(records, filter, value, options = {}) records.where(filter => value) end - def apply_filters(records, filters) + def apply_filters(records, filters, options = {}) required_includes = [] if filters @@ -338,12 +338,12 @@ def apply_filters(records, filters) if _associations.include?(filter) if _associations[filter].is_a?(JSONAPI::Association::HasMany) required_includes.push(filter) - records = apply_filter(records, "#{filter}.#{_associations[filter].primary_key}", value) + records = apply_filter(records, "#{filter}.#{_associations[filter].primary_key}", value, options) else - records = apply_filter(records, "#{_associations[filter].foreign_key}", value) + records = apply_filter(records, "#{_associations[filter].foreign_key}", value, options) end else - records = apply_filter(records, filter, value) + records = apply_filter(records, filter, value, options) end end end @@ -362,7 +362,7 @@ def filter_records(filters, options) records = records(options) records = apply_includes(records, include_directives) - apply_filters(records, filters) + apply_filters(records, filters, options) end def sort_records(records, order_options) @@ -603,7 +603,7 @@ def _associate(klass, *attrs) if resource_class records = public_send(associated_records_method_name) - records = resource_class.apply_filters(records, filters) + records = resource_class.apply_filters(records, filters, options) order_options = self.class.construct_order_options(sort_criteria) records = resource_class.apply_sort(records, order_options) records = resource_class.apply_pagination(records, paginator, order_options) diff --git a/test/unit/resource/resource_test.rb b/test/unit/resource/resource_test.rb index 5c61c2735..709a77e22 100644 --- a/test/unit/resource/resource_test.rb +++ b/test/unit/resource/resource_test.rb @@ -143,7 +143,7 @@ def test_has_many_association_filters # define apply_filters method on post resource to not respect filters PostResource.instance_eval do - def apply_filters(records, filters) + def apply_filters(records, filters, options) # :nocov: records # :nocov: @@ -155,7 +155,7 @@ def apply_filters(records, filters) # reset method to original implementation PostResource.instance_eval do - def apply_filters(records, filters) + def apply_filters(records, filters, options) # :nocov: super # :nocov: