Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Active Admin: sorting on multiple columns

Active Admin doesn't seem to support multiple columns sorting yet (i.e. pass multiple values to the config.sortable option). I saw an old monkey patch here but it doesn't seem to work with my version (1.0.0.pre from Github).

Is there any way to get multiple sortable columns on the latest Active Admin version?

like image 579
Bastien Léonard Avatar asked Jul 10 '14 09:07

Bastien Léonard


2 Answers

This is also a monkey patch:

Create a new file in config/initializers or in the lib folder: multiple_columns_sorting.rb

module ActiveAdmin
  class ResourceController < BaseController
    module DataAccess
      def apply_sorting(chain)
        params[:order] ||= active_admin_config.sort_order

        orders = []
        params[:order].split('_and_').each do |fragment|
          order_clause = OrderClause.new fragment
          if order_clause.valid?
            orders << order_clause.to_sql(active_admin_config)
          end
        end

        if orders.empty?
          chain
        else
          chain.reorder(orders.shift).order(orders)
        end
      end
    end
  end
end

Restart the server. Now you can use several columns name separeted by "_and_". For example:

config.sort_order = 'first_name_desc_and_last_name_asc'
like image 146
nistvan Avatar answered Sep 25 '22 23:09

nistvan


For ActiveAdmin v0.6.0, I tweaked the monkey patch to something like this

# initializers/active_admin.rb
module ActiveAdmin
  class ResourceController
    module DataAccess
      def apply_sorting(chain)
        params[:order] ||= active_admin_config.sort_order

        orders = []
        params[:order].present? && params[:order].split(/\s*,\s*/).each do |fragment|
          fragment =~ /^([\w\_\.]+)_(desc|asc)$/
          column = $1
          order  = $2
          table  = active_admin_config.resource_column_names.include?(column) ? active_admin_config.resource_table_name : nil
          table_column = (column =~ /\./) ? column :
            [table, active_admin_config.resource_quoted_column_name(column)].compact.join(".")

          orders << "#{table_column} #{order}"
        end

        if orders.empty?
          chain
        else
          chain.reorder(orders.shift).order(orders)
        end
      end
    end
  end
end

For my case, I would use it as following as it's more natural to me:

config.sort_order = 'first_name_desc, last_name_asc'

The details are from my gist https://gist.github.com/anhkind/5e9d849ebe4f3a452e31

like image 41
Anh Nguyen Avatar answered Sep 23 '22 23:09

Anh Nguyen