lib/fetcha.rb in fetcha-0.2.2 vs lib/fetcha.rb in fetcha-0.2.3

- old
+ new

@@ -1,15 +1,14 @@ -require "fetcha/version" -require "active_support/concern" +require 'fetcha/version' +require 'active_support/concern' module Fetcha extend ActiveSupport::Concern module ClassMethods - def fetch(params = {}) - results = self.all + results = all query_scope = params['scope'] filters = params['filter'] sorting = params['sort'] pages = params['page'] search = params['search'] @@ -26,11 +25,11 @@ @total_count = nil super end def total_count(column_name = :all, _options = nil) - @total_count ||= + @total_count ||= begin c = except(:offset, :limit, :order) c = c.count(column_name) if c.is_a?(Hash) || c.is_a?(ActiveSupport::OrderedHash) @@ -47,21 +46,21 @@ def fetchable_opts @fetchable_opts ||= { filtering: {}, sorting: {}, - scopes: Set.new(), + scopes: Set.new, pagination: { default_size: 10, max_size: 50 } } end def fulltext_search_on(*fields) include PgSearch - self.pg_search_scope :search_full_text, against: fields, using: { trigram: { threshold: 0.1 }, tsearch: { prefix: true } } + pg_search_scope :search_full_text, against: fields, using: { trigram: { threshold: 0.1 }, tsearch: { prefix: true } } end def filterable_on(*fields) fields.each do |field| fetchable_opts[:filtering][field.to_s] = nil @@ -82,31 +81,36 @@ fetchable_opts[:pagination][k] = args[k] end end def process_scope(datasource, query_scope) - datasource.send(query_scope) if (fetchable_opts[:scopes].include? query_scope.to_sym) + datasource.send(query_scope) if fetchable_opts[:scopes].include? query_scope.to_sym end def process_search(datasource, search) datasource.search_full_text(search) end def process_filtering(datasource, filters = {}) filter_opts = fetchable_opts[:filtering] - includes = Set.new() - - real_filters = filters.select do |k| + includes = Set.new + + real_filters = filters.select do |k| next unless filter_opts.keys.include? k values = k.split('.') includes << values.first if values.second.present? true end results = includes.empty? ? datasource : datasource.includes(includes.to_a) real_filters.each do |key, value| - results = process_operation(results, key, value) + v = if value =~ /,/ + value.split(',') + else + value + end + results = process_operation(results, key, v) end results end def process_sorting(datasource, sorting) @@ -120,11 +124,11 @@ if value.is_a? Hash value.each do |operation, value| results = send("#{operation}_filter", results, field, value) end else - results = results.where({field => value}) + results = results.where(field => value) end results end def process_pagination!(datasource, page = {}) @@ -156,11 +160,11 @@ def ends_with_filter(datasource, field, value) datasource.where("#{field} ilike ?", "%#{value}") end def method_missing(name, *args, block) - raise ForbiddenError if name.match /.*_filter$/ + raise ForbiddenError if name =~ /.*_filter$/ super end end module SortParams @@ -182,9 +186,8 @@ hash[field] = :asc end end end end - class ForbiddenError < StandardError; end end