diff --git a/.gitignore b/.gitignore index d87d4be6..2de39049 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,4 @@ spec/reports test/tmp test/version_tmp tmp +.idea diff --git a/ajax-datatables-rails.gemspec b/ajax-datatables-rails.gemspec index a266644a..e76a67d2 100644 --- a/ajax-datatables-rails.gemspec +++ b/ajax-datatables-rails.gemspec @@ -1,5 +1,6 @@ # -*- encoding: utf-8 -*- require File.expand_path('../lib/ajax-datatables-rails', __FILE__) +require File.expand_path('../lib/mongoid_filters', __FILE__) Gem::Specification.new do |gem| gem.authors = ["Joel Quenneville"] @@ -16,4 +17,7 @@ Gem::Specification.new do |gem| gem.version = AjaxDatatablesRails::VERSION gem.add_development_dependency "rspec" + gem.add_dependency "mongoid" + gem.add_dependency "activesupport" end + diff --git a/lib/ajax-datatables-rails.rb b/lib/ajax-datatables-rails.rb index a3019acb..39eb9384 100644 --- a/lib/ajax-datatables-rails.rb +++ b/lib/ajax-datatables-rails.rb @@ -4,9 +4,9 @@ class AjaxDatatablesRails class MethodError < StandardError; end - VERSION = '0.0.1' + VERSION = '0.0.10' - attr_reader :columns, :model_name, :searchable_columns + attr_reader :columns, :model_name, :searchable_columns, :filters_parameter def initialize(view) @view = view @@ -35,22 +35,22 @@ def get_raw_records raise MethodError, "The method `get_raw_records' is not defined." end - def filtered_record_count + def get_raw_record_count search_records(get_raw_records).count end - + + def filtered_record_count + search_records(filter_records(get_raw_records)).count + end + def fetch_records - search_records(sort_records(paginate_records(get_raw_records))) + search_records(filter_records(sort_records(paginate_records(get_raw_records)))) end def paginate_records(records) records.page(page).per(per_page) end - def sort_records(records) - records.order("#{sort_column} #{sort_direction}") - end - def search_records(records) if params[:sSearch].present? query = @searchable_columns.map do |column| @@ -61,6 +61,19 @@ def search_records(records) return records end + def sort_records(records) + records.order_by(sort_column.to_s => sort_direction) + end + + def filter_records(records, filters = nil) + filters ||= @filters_parameter ? @view.request.filtered_parameters[@filters_parameter.to_s] : nil + if @model_name.respond_to? :filter_criteria + records.where(@model_name.filter_criteria(filters)) + else + records + end + end + def page params[:iDisplayStart].to_i/per_page + 1 end @@ -74,6 +87,7 @@ def sort_column end def sort_direction - params[:sSortDir_0] == "desc" ? "DESC" : "ASC" + params[:sSortDir_0] == "desc" ? 1 : -1 end + end diff --git a/lib/mongoid_filters.rb b/lib/mongoid_filters.rb new file mode 100644 index 00000000..1430ba4a --- /dev/null +++ b/lib/mongoid_filters.rb @@ -0,0 +1,38 @@ +module Mongoid + module Filters + extend ::ActiveSupport::Concern + + module ClassMethods + def filter(attrs) + + attrs.each do |method| + eval "attr_accessor :#{method}_gte, :#{method}_lte, :#{method}_eq, :#{method}_is_null, :#{method}_is_not_null" + end + + def filter_criteria(filters = nil) + f = {} + if filters.present? + filters.each_pair do |k,v| + match = k.match(/\b(\w*)_(gte|lte|eq|is_null|is_not_null)\b/) + if match[2] == "eq" + f.merge!({"#{match[1]}" => v}) + elsif match[2] == "is_null" + f.merge!({"#{match[1]}" => nil }) if v.to_i == 1 || v == true || v == "true" + elsif match[2] == "is_not_null" + f.merge!({"#{match[1]}" => {"$ne" => nil} }) if v.to_i == 1 || v == true || v == "true" + else + f.each_pair{|k,v| found_key = k if k.to_s == match[1] && v.class.name == "Hash"} + if found_key + f[found_key].merge!({"$#{match[2]}" => v}) + else + f.merge!({"#{match[1]}" => {"$#{match[2]}" => v}}) + end + end + end + end + f + end + end + end + end +end