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

时间:2014-07-10 09:19:08

标签: ruby-on-rails ruby activeadmin

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

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

5 个答案:

答案 0 :(得分: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

重启服务器。现在,您可以使用由"_and_"分隔的多个列名称。例如:

config.sort_order = 'first_name_desc_and_last_name_asc'

答案 1 :(得分: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

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

config.sort_order = 'first_name_desc, last_name_asc'

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

答案 2 :(得分:1)

如果你想要更新它只有1或2个字段,那么你就可以这样做。在您的Active Admin Controller中,只需使用此方法即可。当您传递full_name进行排序时,此方法将使用first_name和last_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

答案 3 :(得分:1)

您可以添加这样的内容

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

  config.sort_order = ''
end

答案 4 :(得分:1)

该修补程序不适用于最新版本。以下是两个小更改。适用于v2.8.1

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(active_admin_config, fragment)
          if order_clause.valid?
            orders << order_clause.to_sql
          end
        end

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