Active Admin: сортировка по нескольким столбцам

Active Admin, похоже, не поддерживает сортировку нескольких столбцов (т. е. передает несколько значений в ). Я видел старую обезьянью заплату здесь но это не работает с моей версией (1.0.0.pre из Github).

есть ли способ получить несколько сортируемых столбцов в последней версии Active Admin?

3 ответов


Это также патч обезьяны:

создайте новый файл в config / initializers или в папке lib: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

перезапустить сервер. Теперь вы можете использовать несколько столбцов есть "_and_". Например:

config.sort_order = 'first_name_desc_and_last_name_asc'

для ActiveAdmin v0.6.0, я настроил патч обезьяны на что-то вроде этого

# 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 = 
          order  = 
          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

для моего случая я бы использовал его следующим образом, поскольку это более естественно для меня:

config.sort_order = 'first_name_desc, last_name_asc'

подробности из моего gist https://gist.github.com/anhkind/5e9d849ebe4f3a452e31


Ну, если его только 1 или 2 поля вы хотите обновить, то вы можете сделать это так. В Active Admin Controller просто используйте этот метод. Этот метод использует столбец first_name и last_name для сортировки, когда вы передаете full_name для сортировки.

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