2014-07-10 17 views
6

Active Admin non sembra supportare più ordinamento di colonne ancora (ad esempio, passare più valori all'opzione config.sortable). Ho visto una vecchia patch per scimmia here ma non sembra funzionare con la mia versione (1.0.0.pre da Github).Active Admin: ordinamento su più colonne

C'è un modo per ottenere più colonne ordinabili nell'ultima versione di Active Admin?

risposta

14

Questa è anche una patch scimmia:

Creare un nuovo file in config/inizializzatori o nella cartella 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 

Riavviare il server. Ora è possibile utilizzare più colonne con il nome separato da "_and_". Per esempio:

config.sort_order = 'first_name_desc_and_last_name_asc' 
+0

Mi dispiace, ho dimenticato di assegnare la taglia. –

+0

Grazie, Bastien Léonard. :) – nistvan

5

Per ActiveAdmin v0.6.0, ho ottimizzato la patch scimmia per qualcosa di simile

# 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 

Per il mio caso, vorrei usarlo come segue come è più naturale per me:

config.sort_order = 'first_name_desc, last_name_asc' 

I dettagli sono dalla mia sostanza https://gist.github.com/anhkind/5e9d849ebe4f3a452e31

1

Beh, se il suo solo 1 o 2 campi y vuoi aggiornare, quindi puoi farlo in questo modo. Nel tuo Active Admin Controller usa questo metodo. Questo metodo usa la colonna first_name e last_name per l'ordinamento, quando si passa full_name per l'ordinamento.

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