From b234de188e86dd990a1a79a2488aa620df17840d Mon Sep 17 00:00:00 2001 From: David Tee Date: Tue, 28 Oct 2014 22:14:47 -0700 Subject: [PATCH 1/4] Option to allow serializer to control filter process. For example: /api/v1/accounts?min_age=18&max_age=50 --- README.md | 25 ++++++++++++++++++++++++- lib/restpack_serializer/options.rb | 7 ++++++- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d08ea1d..49e92b8 100644 --- a/README.md +++ b/README.md @@ -352,7 +352,30 @@ class Account include RestPack::Serializer attributes :id, :application_id, :created_by, :name, :href - can_filter_by :application_id + can_filter_by :application_id, :min_age, :max_age + + def self.filters_from_params(params, serializer) + filters = { + :approved => ['t'] + } + + if (params[:min_age] || params[:max_age]) + if (!params[:min_age]) + params[:min_age] = 18 + end + + if (!params[:max_age]) + params[:max_age] = 99 + end + + min_dob = DateTime.now.advance(:years => -params[:max_age].to_i) + max_dob = DateTime.now.advance(:years => -params[:min_age].to_i) + + filters[:date_of_birth] = min_dob..max_dob + end + + return filters + end end ``` diff --git a/lib/restpack_serializer/options.rb b/lib/restpack_serializer/options.rb index 030b19b..fae5a32 100644 --- a/lib/restpack_serializer/options.rb +++ b/lib/restpack_serializer/options.rb @@ -10,7 +10,12 @@ def initialize(serializer, params = {}, scope = nil, context = {}) @page = params[:page] ? params[:page].to_i : 1 @page_size = params[:page_size] ? params[:page_size].to_i : RestPack::Serializer.config.page_size @include = params[:include] ? params[:include].split(',').map(&:to_sym) : [] - @filters = filters_from_params(params, serializer) + if serializer.respond_to? :filters_from_params + @filters = serializer.filters_from_params(params, serializer) + else + @filters = filters_from_params(params, serializer) + end + @sorting = sorting_from_params(params, serializer) @serializer = serializer @model_class = serializer.model_class From 193c575debf1ce103a64f3dfe54de1ca7642173e Mon Sep 17 00:00:00 2001 From: David Tee Date: Tue, 28 Oct 2014 23:06:28 -0700 Subject: [PATCH 2/4] Fix range generation... need a better solution to reverse map filter to url. --- lib/restpack_serializer/options.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/restpack_serializer/options.rb b/lib/restpack_serializer/options.rb index fae5a32..a994c4b 100644 --- a/lib/restpack_serializer/options.rb +++ b/lib/restpack_serializer/options.rb @@ -77,6 +77,7 @@ def map_filter_ids(key,value) case value when Hash value.map { |k,v| map_filter_ids(k,v) } + when Range else "#{key}=#{value.join(',')}" end From bb8161da42a7d8a9f5ef276e61930beaca4e47ee Mon Sep 17 00:00:00 2001 From: David Tee Date: Thu, 13 Nov 2014 00:51:18 -0800 Subject: [PATCH 3/4] Allows serializer to override scope_with_filters. --- README.md | 17 +++++++++++++ lib/restpack_serializer/options.rb | 38 ++++++++++++++++++++---------- 2 files changed, 42 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 49e92b8..be63b55 100644 --- a/README.md +++ b/README.md @@ -376,6 +376,23 @@ class Account return filters end + + def self.scope_with_filters(options) + if (options.filters[:participant_id]) + participant_id = options.filters[:participant_id] + options.filters.delete(:participant_id) + + filter = {game_participations: { + participant_id: participant_id + }} + .merge(options.filters) + options.scope = options.scope.joins(:game_participations).where(filter) + return options.scope + end + + # Let Default Options take care of it + return nil + end end ``` diff --git a/lib/restpack_serializer/options.rb b/lib/restpack_serializer/options.rb index a994c4b..2e98e09 100644 --- a/lib/restpack_serializer/options.rb +++ b/lib/restpack_serializer/options.rb @@ -10,12 +10,15 @@ def initialize(serializer, params = {}, scope = nil, context = {}) @page = params[:page] ? params[:page].to_i : 1 @page_size = params[:page_size] ? params[:page_size].to_i : RestPack::Serializer.config.page_size @include = params[:include] ? params[:include].split(',').map(&:to_sym) : [] + if serializer.respond_to? :filters_from_params @filters = serializer.filters_from_params(params, serializer) - else + end + + unless @filters @filters = filters_from_params(params, serializer) end - + @sorting = sorting_from_params(params, serializer) @serializer = serializer @model_class = serializer.model_class @@ -25,14 +28,23 @@ def initialize(serializer, params = {}, scope = nil, context = {}) end def scope_with_filters - scope_filter = {} - - @filters.keys.each do |filter| - value = query_to_array(@filters[filter]) - scope_filter[filter] = value + result = nil + if @serializer.respond_to? :scope_with_filters + result = @serializer.scope_with_filters(self) end - @scope.where(scope_filter) + if result + return result + else + scope_filter = {} + + @filters.keys.each do |filter| + value = query_to_array(@filters[filter]) + scope_filter[filter] = value + end + + @scope.where(scope_filter) + end end def default_page_size? @@ -75,11 +87,11 @@ def sorting_from_params(params, serializer) def map_filter_ids(key,value) case value - when Hash - value.map { |k,v| map_filter_ids(k,v) } - when Range - else - "#{key}=#{value.join(',')}" + when Hash + value.map { |k,v| map_filter_ids(k,v) } + when Range + else + "#{key}=#{value.join(',')}" end end From 362c02b95cfe0a1e313c9484ce864f56f6597adb Mon Sep 17 00:00:00 2001 From: David Tee Date: Mon, 14 Mar 2016 22:27:36 -0700 Subject: [PATCH 4/4] Restore options.rb --- .gitignore | 1 + lib/restpack_serializer/options.rb | 11 ++++++----- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index 5d670a1..60ebfd6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +.idea *.gem *.db tmp diff --git a/lib/restpack_serializer/options.rb b/lib/restpack_serializer/options.rb index 1b798c2..2e98e09 100644 --- a/lib/restpack_serializer/options.rb +++ b/lib/restpack_serializer/options.rb @@ -9,7 +9,7 @@ def initialize(serializer, params = {}, scope = nil, context = {}) @page = params[:page] ? params[:page].to_i : 1 @page_size = params[:page_size] ? params[:page_size].to_i : RestPack::Serializer.config.page_size - @include = params[:include] ? params[:include].split(',') : [] + @include = params[:include] ? params[:include].split(',').map(&:to_sym) : [] if serializer.respond_to? :filters_from_params @filters = serializer.filters_from_params(params, serializer) @@ -87,10 +87,11 @@ def sorting_from_params(params, serializer) def map_filter_ids(key,value) case value - when Hash - value.map { |k,v| map_filter_ids(k,v) } - else - "#{key}=#{value.join(',')}" + when Hash + value.map { |k,v| map_filter_ids(k,v) } + when Range + else + "#{key}=#{value.join(',')}" end end