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/README.md b/README.md index dfcc4b2..54fe43c 100644 --- a/README.md +++ b/README.md @@ -365,7 +365,47 @@ 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 + + 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 83728b8..2e98e09 100644 --- a/lib/restpack_serializer/options.rb +++ b/lib/restpack_serializer/options.rb @@ -9,8 +9,16 @@ 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(',') : [] - @filters = filters_from_params(params, serializer) + @include = params[:include] ? params[:include].split(',').map(&:to_sym) : [] + + if serializer.respond_to? :filters_from_params + @filters = serializer.filters_from_params(params, serializer) + end + + unless @filters + @filters = filters_from_params(params, serializer) + end + @sorting = sorting_from_params(params, serializer) @serializer = serializer @model_class = serializer.model_class @@ -20,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? @@ -70,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