Active admin: sort by multiple columns

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

Is there a way to get multiple sortable columns in the latest version of Active Admin?

+6
source share
3 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 

Reboot the server. Now you can use multiple column names separated by the symbol "_and_" . For instance:

 config.sort_order = 'first_name_desc_and_last_name_asc' 
+14
source

For ActiveAdmin v0.6.0 I changed 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 

In my case, I will use it as the following, since it is more natural for me:

 config.sort_order = 'first_name_desc, last_name_asc' 

Details taken from my gist https://gist.github.com/anhkind/5e9d849ebe4f3a452e31

+5
source

Well, if its only 1 or 2 fields you want to update, then you can do it like this. In your Active Admin Controller, just use this method. This method uses the names first_name and last_name to sort when you pass full_name to sort.

 def apply_sorting(chain) params[:order] ||= active_admin_config.sort_order order_clause = ActiveAdmin::OrderClause.new params[:order] if order_clause.field == 'full_name' chain.reorder("(first_name, last_name) #{order_clause.order}") else super end end 
+1
source

Source: https://habr.com/ru/post/972016/


All Articles