class Filtrum::View
Attributes
base_count_query[RW]
base_query[RW]
config[R]
fields[R]
name[R]
quick_search_block[RW]
serialize_record_block[RW]
serialize_response_block[RW]
settings[R]
Public Class Methods
new(name, config, options = {})
click to toggle source
# File lib/filtrum/view.rb, line 7 def initialize name, config, options = {}, &block @name, @config = name, config @fields = [] @base_query = @config.model @base_count_query = nil @settings = Settings.new @config.settings if block dsl = DSL.new self dsl.extend @settings.dsl dsl.instance_eval &block end end
Public Instance Methods
field(name)
click to toggle source
# File lib/filtrum/view.rb, line 24 def field name @fields.find{ |f| f.name.to_s == name.to_s } end
process(options = {})
click to toggle source
# File lib/filtrum/view.rb, line 28 def process options = {} q = options[:base] || @base_query cq = options[:base_count] || @base_count_query if @quick_search_block and options[:quickSearch].present? q = @quick_search_block.call q, options[:quickSearch].to_s cq = @quick_search_block.call cq, options[:quickSearch].to_s if cq end total = (cq || q).count raise BaseQueryError, "Count query must return a number" unless total.kind_of?(Fixnum) if options[:sort].present? options[:sort].select{ |item| item.match /\A([^ ]+)* (asc|desc)\Z/i }.each do |item| parts = item.split ' ' # TODO: handle unknown fields f = @fields.find{ |f| f.working_name.to_s == parts[0] } q = f.with_order q, parts[1].downcase.to_sym if f end end @fields.each{ |f| q = f.with_includes q } response_options = (options[:response] || {}).merge({ total: total }) page_size = options[:pageSize].to_i page_size = 10 if page_size <= 0 q = q.limit page_size max_page = (total.to_f / page_size).ceil page = options[:page].to_i # TODO: allow this to be disabled if page < 1 or page > max_page page = 1 response_options[:page] = 1 end q = q.offset (page - 1) * page_size serialize_response q, response_options end
Private Instance Methods
serialize_record(record)
click to toggle source
# File lib/filtrum/view.rb, line 112 def serialize_record record @serialize_record_block ? @serialize_record_block.call(record) : @fields.inject({}){ |memo,f| memo[f.working_name] = f.extract(record); memo } end
serialize_response(query, response_options = {})
click to toggle source
# File lib/filtrum/view.rb, line 100 def serialize_response query, response_options = {} res = response_options.merge data: query.to_a if @serialize_response_block @serialize_response_block.call res else res[:data] = res[:data].collect{ |r| serialize_record r } res end end