Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
.idea
*.gem
*.db
tmp
Expand Down
42 changes: 41 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
```

Expand Down
42 changes: 30 additions & 12 deletions lib/restpack_serializer/options.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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?
Expand Down Expand Up @@ -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

Expand Down