排序列时如何忽略大小写

时间:2013-11-27 19:12:34

标签: ruby-on-rails ruby ruby-on-rails-3 sorting activeadmin

当我在name中对模型的ActiveAdmin列进行排序时,会得到如下输出:

  • 苹果
  • 冰柱
  • 斑马
  • 的iMac
  • 的iPhone

其中大写和小写字母似乎单独排序。我更喜欢以下列方式显示已排序的列:

  • 苹果
  • 冰柱
  • 的iMac
  • 的iPhone
  • 斑马

没有不自然的区分大小写。我尝试使用

column :name, sortable: 'my_model.name.downcase'

缓解此问题,但这会引发ActiveRecord::StatementInvalid错误。我怎样才能让它发挥作用?

1 个答案:

答案 0 :(得分:1)

如果你把它放在你的active_admin.rb中:

module ActiveAdmin

  class ResourceController < BaseController

    module DataAccess
      def apply_sorting(chain)
        params[:order] ||= active_admin_config.sort_order
        if params[:order] && params[:order] =~ /^(lower_)?([\w\_\.]+)_(desc|asc)$/
          icase = params[:order].to_s.starts_with?('lower_')
          column = $2
          order  = $3
          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(".")

          chain.reorder("#{'lower' if icase}(#{table_column}) #{order}")
        else
          chain # just return the chain
        end
      end
    end
  end
end

然后你可以这样做:

column :name, sortable: 'lower_name'

如果使用块调用column方法,这也可以。

显然,如果你碰巧有一个你希望用名为“lower_anything”的列做这个,你可能需要进行调整。

相关问题