From 9c9e439a06fecff698427f5f33064512f5ac6658 Mon Sep 17 00:00:00 2001 From: Chris Miller Date: Wed, 7 Jan 2015 13:17:45 -0700 Subject: [PATCH 1/2] Allow namespaced models to work. --- lib/ajax-datatables-rails/base.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ajax-datatables-rails/base.rb b/lib/ajax-datatables-rails/base.rb index 147d17a2..c949e1c2 100644 --- a/lib/ajax-datatables-rails/base.rb +++ b/lib/ajax-datatables-rails/base.rb @@ -104,7 +104,7 @@ def build_conditions_for(query) def search_condition(column, value) model, column = column.split('.') - model = model.singularize.titleize.gsub( / /, '' ).constantize + model = model.singularize.titleize.gsub('/', '::').gsub( / /, '' ).constantize casted_column = ::Arel::Nodes::NamedFunction.new('CAST', [model.arel_table[column.to_sym].as(typecast)]) casted_column.matches("%#{value}%") From d132891341bcedfc8b01462ae35e7e0e00fcea0f Mon Sep 17 00:00:00 2001 From: Kevin Watson Date: Mon, 4 May 2015 14:43:06 -0600 Subject: [PATCH 2/2] Allow searchable columns to be passed in as an array of models --- lib/ajax-datatables-rails/base.rb | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/lib/ajax-datatables-rails/base.rb b/lib/ajax-datatables-rails/base.rb index c949e1c2..9979977d 100644 --- a/lib/ajax-datatables-rails/base.rb +++ b/lib/ajax-datatables-rails/base.rb @@ -102,11 +102,26 @@ def build_conditions_for(query) criteria end - def search_condition(column, value) - model, column = column.split('.') - model = model.singularize.titleize.gsub('/', '::').gsub( / /, '' ).constantize + # Allow searchable columns to be passed in as an array of models. + # Format: [model, model, model.field] + # This allows searching on nested models/tables where active record aliases table names + # Examples: + # Model1.joins(:employees, {:model2 => :employees}) + # @searchable_columns << ['model2', 'employee.first_name'] + def search_condition(columns, value) + if columns.is_a?(Array) + models = columns.map {|c| c.split('.').first} + column_name = columns.find {|c| c =~ /\./}.split('.').last + models.sort! # assume that the tables in the active record auto-generated table alias are combined alphabetically + table_alias = models.map {|m| m.downcase.pluralize.gsub(/\W+/, '_')}.join('_') + primary_table = models[0].singularize.titleize.gsub(/\W+/, '_').constantize + table = primary_table.arel_table.alias table_alias + else + model, column_name = columns.split('.') + table = model.singularize.titleize.gsub('/', '::').gsub( / /, '' ).constantize.arel_table + end - casted_column = ::Arel::Nodes::NamedFunction.new('CAST', [model.arel_table[column.to_sym].as(typecast)]) + casted_column = ::Arel::Nodes::NamedFunction.new('CAST', [table[column_name.to_sym].as(typecast)]) casted_column.matches("%#{value}%") end