Sha256: 1b3c32de31f006bfac76b0f7cd824dfb1b476ff2f67b29c7ab2465509b37b2bd

Contents?: true

Size: 1.52 KB

Versions: 3

Compression:

Stored size: 1.52 KB

Contents

module Tableling

  class Model

    def initialize options = {}, &block

      @fields = []
      @field_options = {}

      Array.wrap(options[:modules] || []).each do |mod|
        extend mod
        initialize_model options if respond_to? :initialize_model
      end

      instance_eval &block if block
    end

    def field name, options = {}, &block
      if field = @fields.find{ |f| f.name.to_s == name.to_s }
        return field
      end
      # TODO: do not add field if it's already there
      Field.new(name, @field_options.merge(options), &block).tap{ |f| @fields << f }
    end

    def quick_search &block
      @quick_search = block
    end

    def process params
      
      q = params[:base] || base_query

      if @quick_search and params[:quickSearch].present?
        q = @quick_search.call q, params[:quickSearch].to_s
      end

      total = q.count :all

      if params[:sort].present?
        params[:sort].select{ |item| item.match /\A([^ ]+)* (asc|desc)\Z/ }.each do |item|
          parts = item.split ' '
          q = field(parts[0]).with_order q, parts[1].to_sym
        end
      end

      @fields.each{ |f| q = f.with_includes q }

      limit = params[:pageSize].to_i
      limit = 10 if limit <= 0
      q = q.limit limit

      offset = params[:page].to_i - 1
      offset = 0 if offset < 0
      q = q.offset offset * limit

      {
        :total => total,
        :data => q.all.collect{ |o|
          @fields.inject({}){ |memo,f| memo[f.name] = f.extract(o); memo }
        }
      }
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
tableling-rails-0.0.10 lib/tableling-rails/model.rb
tableling-rails-0.0.9 lib/tableling-rails/model.rb
tableling-rails-0.0.8 lib/tableling-rails/model.rb