Active Admin: sorting on multiple columns

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'

You can add something like this

ActiveAdmin.register Model do
  controller do
    def scoped_collection
      Model.order('field_1 DESC, field2 ASC')
    end
  end

  config.sort_order = ''
end

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