2014-07-10 17 views
6

Active Admin scheint nicht mehrere Spalten sortieren noch zu unterstützen (d. H. Mehrere Werte an die Option config.sortable übergeben). Ich sah einen alten Affen Patch here, aber es scheint nicht mit meiner Version (1.0.0.pre von Github) zu arbeiten.Active Admin: Sortieren nach mehreren Spalten

Gibt es eine Möglichkeit, mehrere sortierbare Spalten in der neuesten Active Admin-Version zu erhalten? Diese

Antwort

14

ist auch ein Affe Patch:

Erstellen Sie eine neue Datei in config/initializers oder im Ordner 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 

Starten Sie den Server. Jetzt können Sie mehrere Spaltennamen verwenden, die durch "_and_" getrennt sind. Zum Beispiel:

config.sort_order = 'first_name_desc_and_last_name_asc' 
+0

Sorry, ich habe vergessen, das Kopfgeld zu vergeben. –

+0

Danke, Bastien Léonard. :) – nistvan

5

für ActiveAdmin v0.6.0, ich gezwickt die Affen-Patch zu so etwas wie diese

# 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 

Für meinen Fall würde ich es wie folgt verwenden, wie es mir natürlicher ist:

config.sort_order = 'first_name_desc, last_name_asc' 

Die Details sind aus meinem Kern https://gist.github.com/anhkind/5e9d849ebe4f3a452e31

1

Nun, wenn sie nur 1 oder 2 Felder y Du willst updaten, dann kannst du es so machen. Verwenden Sie in Ihrem Active Admin Controller diese Methode. Diese Methode verwendet die Spalten first_name und last_name zum Sortieren, wenn Sie full_name zum Sortieren übergeben.

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 
Verwandte Themen