class Right::RansackableFilterParametersAdapter
Converts array of parameters to hash familiar to ransack gem
Attributes
app[R]
Public Class Methods
new(app)
click to toggle source
# File lib/right/ransackable_filter_parameters_adapter.rb, line 6 def initialize(app) @app = app end
Public Instance Methods
call(env)
click to toggle source
# File lib/right/ransackable_filter_parameters_adapter.rb, line 10 def call(env) scope, params = env ransackable_parameters = Array(params[:filter]).reject { |f| f.predicate.nil? } .each_with_object({}) do |filter, ransackable_filters| ransackable_filters[canonical_name_for(filter)] = filter.value end app.call([scope, params.merge(filter: ransackable_parameters)]) end
Private Instance Methods
canonical_name_for(filter)
click to toggle source
@return [String, nil] filter with predicate. E.g. `first_name_eq`
nil value means that
# File lib/right/ransackable_filter_parameters_adapter.rb, line 28 def canonical_name_for(filter) if filter.on.is_a?(Hash) name_for_polymorphic(filter) else [filter.on, filter.name, filter.predicate].compact.join('_') end end
name_for_polymorphic(filter)
click to toggle source
Build query method for polymorphic association @see github.com/activerecord-hackery/ransack/wiki/Polymorphic-searches @see github.com/activerecord-hackery/ransack/commit/c156fa4a7ac6e1a8d730791c49bf4403aa0f3af7#diff-a26803e1ff6e56eb67b80c91d79a063eR34 @param [SortParameter] filter @return [String]
@example
definition = ParameterDefinition.new('genre_name', on: { resource: ['Movie', 'Channel'] }) parameter = Parameter.new('Horror', 'eq', definition) name_for_polymorphic(parameter) #=> 'resource_of_Movie_type_genre_name_or_resource_of_Channel_type_genre_name_eq'
# File lib/right/ransackable_filter_parameters_adapter.rb, line 49 def name_for_polymorphic(filter) unless filter.on.size == 1 fail ArgumentError, 'Polymorphic association must be defined as Hash with single value' end polymorphic_name = filter.on.keys.first name = Array(filter.on.values.first) .map { |polymorphic_type| "#{polymorphic_name}_of_#{polymorphic_type}_type_#{filter.name}" } .join('_or_') "#{name}_#{filter.predicate}" end