@@ -35,9 +35,11 @@ def self.extract_attributes_and_predicates(requested_field, allowed_fields)
3535 # @param allowed_fields [Array] a list of allowed fields to be filtered
3636 # @param options [Hash] extra flags to enable/disable features
3737 # @return [ActiveRecord::Base] a collection of resources
38- def jsonapi_filter ( resources , allowed_fields , options = { } )
38+ def jsonapi_filter ( resources , allowed_fields , *allowed_scopes , options )
39+ options = options || { }
40+ allowed_scopes = ( allowed_scopes || [ ] ) . flatten . map ( &:to_s )
3941 allowed_fields = allowed_fields . map ( &:to_s )
40- extracted_params = jsonapi_filter_params ( allowed_fields )
42+ extracted_params = jsonapi_filter_params ( allowed_fields , allowed_scopes )
4143 extracted_params [ :sorts ] = jsonapi_sort_params ( allowed_fields , options )
4244 resources = resources . ransack ( extracted_params )
4345 block_given? ? yield ( resources ) : resources
@@ -50,7 +52,7 @@ def jsonapi_filter(resources, allowed_fields, options = {})
5052 #
5153 # @param allowed_fields [Array] a list of allowed fields to be filtered
5254 # @return [Hash] to be passed to [ActiveRecord::Base#order]
53- def jsonapi_filter_params ( allowed_fields )
55+ def jsonapi_filter_params ( allowed_fields , allowed_scopes )
5456 filtered = { }
5557 requested = params [ :filter ] || { }
5658 allowed_fields = allowed_fields . map ( &:to_s )
@@ -65,6 +67,20 @@ def jsonapi_filter_params(allowed_fields)
6567 to_filter = to_filter . split ( ',' )
6668 end
6769
70+ # filter by scopes expects an exact match
71+ # with the `allowed_scopes`. Predicates can be a part of named scopes
72+ # and should be handled first
73+ # Make sure to move to the next after a match
74+ # {"created_before"=>"2013-02-01"}
75+ # {"created_before_gt"=>"2013-02-01"}
76+ if allowed_scopes . include? ( requested_field )
77+ filtered [ requested_field ] = to_filter
78+ next
79+ end
80+
81+
82+ # filter by attributes
83+ # {"first_name_eq"=>"Beau"}
6884 if predicates . any? && ( field_names - allowed_fields ) . empty?
6985 filtered [ requested_field ] = to_filter
7086 end
0 commit comments