活动管理员:对多列进行排序

Bas*_*ard 7 ruby ruby-on-rails activeadmin

Active Admin似乎不支持多列排序(即将多个值传递给该config.sortable选项).我在这里看到了一个老猴子补丁,但它似乎不适用于我的版本(来自Github的1.0.0.pre).

有没有办法在最新的Active Admin版本上获得多个可排序的列?

nis*_*van 15

这也是一个猴子补丁:

在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
Run Code Online (Sandbox Code Playgroud)

重启服务器.现在您可以使用separeted的多个列名称"_and_".例如:

config.sort_order = 'first_name_desc_and_last_name_asc'
Run Code Online (Sandbox Code Playgroud)


Anh*_*yen 5

对于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 = $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
Run Code Online (Sandbox Code Playgroud)

对于我的情况,我会使用它,因为它对我来说更自然:

config.sort_order = 'first_name_desc, last_name_asc'
Run Code Online (Sandbox Code Playgroud)

细节来自我的要点https://gist.github.com/anhkind/5e9d849ebe4f3a452e31