Sha256: ab621d6b2cf10c8274ccd01a377fbb5e177de80ed892f6b75178abce9a0031d1

Contents?: true

Size: 1.54 KB

Versions: 1

Compression:

Stored size: 1.54 KB

Contents

class BazaModels::Ransacker
  AutoAutoloader.autoload_sub_classes(self, __FILE__)

  attr_accessor :query
  attr_reader :db, :klass

  def initialize(args)
    @klass = args.fetch(:class)
    @db = @klass.db
    @params = args.fetch(:params)
    @query = args.fetch(:query)
  end

  def result
    add_filters_to_query unless @add_filters_to_query_executed
    @query
  end

private

  def add_filters_to_query
    @add_filters_to_query_executed = true
    return unless @params

    @params.each do |key, value|
      if (match = key.to_s.match(/\A(.+?)_eq\Z/))
        filter_eq(match[1], value)
      elsif (match = key.to_s.match(/\A(.+?)_cont\Z/))
        filter_cont(match[1], value)
      elsif key.to_s == "s"
        match = value.to_s.match(/\A([A-z_\d]+)\s+(asc|desc)\Z/)
        raise "Couldn't sort-match: #{value}" unless match
        sort_by(column_name: match[1], sort_mode: match[2])
      else
        raise "Unknown modifier: #{key}"
      end
    end
  end

  def filter_eq(column_name, value)
    BazaModels::Ransacker::RelationshipScanner.new(
      column_name: column_name,
      mode: :eq,
      ransacker: self,
      value: value
    )
  end

  def filter_cont(column_name, value)
    BazaModels::Ransacker::RelationshipScanner.new(
      column_name: column_name,
      mode: :cont,
      ransacker: self,
      value: value
    )
  end

  def sort_by(args)
    BazaModels::Ransacker::RelationshipScanner.new(
      column_name: args.fetch(:column_name),
      mode: :sort,
      ransacker: self,
      value: args.fetch(:sort_mode)
    )
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
baza_models-0.0.4 lib/baza_models/ransacker.rb