Sha256: ec9540d592ce44a5a7f94ded8b4d669f94ea71a8720124f1009eabc6e9a2230c

Contents?: true

Size: 1.26 KB

Versions: 2

Compression:

Stored size: 1.26 KB

Contents

require 'active_record'

module Filterism
  extend ActiveSupport::Concern

  module ClassMethods
    def filterable_fields(*fields)
      @filterable_fields = fields.to_s
    end
    def unfilterable_fields(*fields)
      @unfilterable_fields = fields.to_s
    end
    def filter(conditions)
      where_clause = ""
      values = []
      where_mark = '?'
      conditions.each do |condition|
        unless (@filterable_fields and not @filterable_fields.include?(condition[:key])) or (@unfilterable_fields and @unfilterable_fields.include?(condition[:key]))
          if condition[:comparator] == 'LIKE'
            values << "%#{condition[:value]}%"
          elsif condition[:comparator] == 'IN'
            where_mark = '(?)'
            values << condition[:value].split(',')
          else
            values << convert_if_string_is_boolean(condition[:value])
          end

          where_clause << " AND" unless where_clause.empty?

          where_clause << " #{condition[:key]} #{condition[:comparator]} #{where_mark}"
        end
      end

      where(where_clause, *values)
    end

    private
    def convert_if_string_is_boolean(value)
      if value == "true" || value == "false"
        value = (value == "true" ? "t" : "f")
      end
      return value
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
filterism-2.0.1 lib/filterism/adapters/active_record_adapter.rb
filterism-2.0.0 lib/filterism/adapters/active_record_adapter.rb