2013-11-27 42 views
0

時,當我在ActiveAdmin排序模型的name列忽略的情況下,我得到的輸出,如下列:如何排序列

  • 蘋果
  • 冰柱
  • 斑馬
  • iMac電腦
  • iPhone

其中大寫和小寫字母似乎分開排序。我更喜歡以下列方式顯示排序列:

  • 蘋果
  • 冰柱
  • 的iMac
  • 的iPhone
  • 斑馬

沒有不自然的情況下的靈敏度。我試着用線

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

緩解這個問題,但是這將引發ActiveRecord::StatementInvalid錯誤。我怎樣才能使這個工作?

+0

什麼是實際的錯誤輸出?你試過'可排序:'LOWER(my_models_table_name.name)''? –

+0

嘗試'my_model.name.to_s.downcase' – fatfrog

回答

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' 

這也將工作,如果調用帶有塊列方法。

很明顯,如果你碰巧有一列,你想要做這個名爲「lower_anything」,你可能需要調整。

+1

該答案適合我。 (謝謝。) 在上面的答案中,我用lower__替換lower_(雙下劃線)。這消除了無法對名稱以「lower_」開頭的列進行排序。 –