diff --git a/lib/jsonapi/scopes/filters.rb b/lib/jsonapi/scopes/filters.rb index 028eea4..15e8edb 100644 --- a/lib/jsonapi/scopes/filters.rb +++ b/lib/jsonapi/scopes/filters.rb @@ -19,7 +19,7 @@ def apply_filter(params) filtering_params = params.dig(:filter) || {} filtering_params.each do |key, value| - value = value.to_s.split(',').reject(&:blank?) if value.include?(',') + value = value.to_s.split(',').reject(&:blank?) if value&.include?(',') raise InvalidAttributeError, "#{key} is not valid as filter attribute." unless @filters.include?(key.to_sym) diff --git a/lib/jsonapi/scopes/includes.rb b/lib/jsonapi/scopes/includes.rb index 9f29a18..2aea1d7 100644 --- a/lib/jsonapi/scopes/includes.rb +++ b/lib/jsonapi/scopes/includes.rb @@ -21,11 +21,15 @@ def apply_include(params = {}, options = { allowed: [] }) allowed_fields = (Array.wrap(options[:allowed]).presence || @allowed_includes).map(&:to_s) - fields.split(',').each do |field| + a_fields = fields.split(',') + a_fields.each do |field| raise InvalidAttributeError, "#{field} is not valid as include attribute." unless allowed_fields.include?(field) end - records.includes(convert_includes_as_hash(fields)) + preload_fields = a_fields.select { |field| reflect_on_association(field).polymorphic? } + include_fields = a_fields - preload_fields + records.includes(convert_includes_as_hash(include_fields.join(','))) + records.preload(convert_includes_as_hash(preload_fields.join(','))) end private diff --git a/lib/jsonapi/scopes/sorts.rb b/lib/jsonapi/scopes/sorts.rb index ee7a6ce..badfa3c 100644 --- a/lib/jsonapi/scopes/sorts.rb +++ b/lib/jsonapi/scopes/sorts.rb @@ -29,9 +29,20 @@ def apply_sort(params = {}, options = { allowed: [], default: {} }) raise InvalidAttributeError, "#{field} is not valid as sort attribute." unless allowed_fields.include?(field) end - order = ordered_fields.presence || default_order + res = self - self.order(order) + order_to_follow = ordered_fields.presence || default_order + order_to_follow.each do |single_order_q, direction| + if single_order_q.to_s.include? 'scope:' + scope_name = single_order_q.to_s.split(':').last + + res = send(scope_name.to_sym, direction) + else + res = order("#{single_order_q}": direction) + end + end + + res end private