Sha256: 44087412207e054d68e8aa67cafa9197fba3e58a962e2ae6bf367fff873dd5c5

Contents?: true

Size: 1.49 KB

Versions: 3

Compression:

Stored size: 1.49 KB

Contents

module Puffer
  module OrmAdapter
    module ActiveRecord

      def columns_hash
        klass.columns_hash.inject({}) do |result, (name, object)|
          result.merge name => {:type => object.type}
        end
      end

      def filter scope, fields, options = {}
        fields = fields.columns
        conditions, order = extract_conditions_and_order!(options)

        conditions_fields = fields.select {|f| conditions.keys.include?(f.field_name)}.to_fieldset
        search_fields = fields.select {|f| !conditions_fields.include?(f) && search_types.include?(f.column_type)}
        all_fields = conditions_fields + search_fields

        conditions = conditions.reduce({}) do |res, (name, value)|
          field = conditions_fields[name]
          res[field.query_column] = value if field
          res
        end

        order = order.map {|field, direction| "#{field} #{direction}"}.join(', ')

        scope.includes(includes(all_fields)).where(searches(search_fields, options[:search])).where(conditions).order(order)
      end

    private

      def search_types
        [:text, :string, :integer, :decimal, :float]
      end

      def includes fields
        fields.map {|f| f.path unless f.native?}.compact.to_includes
      end

      def searches fields, query
        [fields.map {|f| "#{f.query_column} like ?"}.compact.join(' or '), *(Array.wrap("%#{query}%") * fields.count)] if query.present?
      end

    end
  end
end

ActiveRecord::Base::OrmAdapter.send :include, Puffer::OrmAdapter::ActiveRecord

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
puffer-0.0.32 lib/puffer/orm_adapter/active_record.rb
puffer-0.0.31 lib/puffer/orm_adapter/active_record.rb
puffer-0.0.30 lib/puffer/orm_adapter/active_record.rb