2012-06-21 10 views
12

Ich entwickle eine ActiveAdmin-App, und ich möchte eine Spalte von Unternehmen nach ihrem "Typ" sortieren. Leider funktioniert mein Code nicht. Welchen Code soll ich verwenden, um dies zu erreichen? Hier ist mein Code ...ActiveAdmin, wie Spalte mit Zuordnungen sortiert wird

app/models/business.rb


class Business < ActiveRecord::Base 
    belongs_to :type 

    attr_accessible :description, :email, :facebook, :foursquare, :google, :manager, 
    :mobile, :name, :phone, :type_id, :url, :yelp 
end 

app/models/type.rb


class Type < ActiveRecord::Base 
    attr_accessible :category 
    has_many :businesses 

    def to_s 
    category 
    end 
end 

app/admin/businesses.rb


ActiveAdmin.register Business, { :sort_order => :name_asc } do 
    scope :joined, :default => true do |businesses| 
    businesses.includes [:type] 
    end 
    index do 
    column :name 
    column :type, :sortable => 'businesses.type' 
    column :manager 
    column :email 
    default_actions 
    end 
end 

Danke!

+0

Jeder? Ich bin immer noch mit dieser Straßensperre konfrontiert ... – Slicekick

Antwort

8

FIXED

column :type, :sortable => 'types.category'

+2

In Ihrer Frage setzen Sie die gleiche Zeile ... – dusan

+1

Ich verstehe es nicht? Das ist das gleiche wie oben? – cjm2671

18

nach dieser Diskussion: https://github.com/gregbell/active_admin/pull/623, wenn Sie nicht über Bereiche verwenden möchten, können Sie die scoped Sammelmethode verwenden statt:

ActiveAdmin.register Business, { :sort_order => :name_asc } do 
    scope :all, :default => true 

    index do 
    column :name 
    column :type, :sortable => 'types.category' 
    column :manager 
    column :email 
    default_actions 
    end 

    controller do 
    def scoped_collection 
     end_of_association_chain.includes(:type) 
    end 
    end 
end 
+0

.. und es funktioniert einfach perfekt für mich :) –

+0

dann sollten Sie dies abstimmen! :) – Rimian

+0

Möglicherweise müssen Sie '.references (: type)' nach 'includes (: type)' ketten, um eine Verknüpfung in neueren Versionen von ActiveRecord zu erhalten. – ahmacleod

4

Ja , die scoped_collection Evgenia lieferte tolle Arbeiten. Auch für mehr als eine Spalten:

ActiveAdmin.register Foo do 
    index do 
    column :field_name_a, :sortable => 'association_a.field_name' 
    column :field_name_b, :sortable => 'association_b.field_name' 
    end 
end 

controller do 
    def scoped_collection 
    end_of_association_chain.includes([:association_a, :association_b]) 
    end 
end 
3

Dies kann getan werden.

Hier habe ich ein Modell namens Star. Ein Stern gehört einer Person. Ich werde den Person.name in den Star-Admin-Index einfügen, ihn sortierbar machen, ihn mit Bereichen arbeiten lassen und Filter hinzufügen.

Zuerst müssen Sie das Join-Modell zu jedem Ihrer Bereiche hinzufügen. In diesem Fall hatte ich 3 Bereiche: alle, category_subscriptions und person_subscriptions. Ich erkläre die Bereiche und das Hinzufügen des Join-Modells zu ihnen:

ActiveAdmin.register Star do 
    [ :all, :category_subscriptions, :person_subscriptions ].each do |sym| 
    scope(sym, :default => (sym == :all)) do |stars| 
     stars.includes [:person] 
    end 
    end 
end 

nun die Personennamen aus dem Join-Modell in meinen Sterne Index hinzufügen Ich tue dies:

index do 
    id_column 
    column("Name", nil, :sortable => :"people.name") {|star| star.person.name} 
    column("Email", nil, :sortable => :"people.email") {|star| star.person.email} 
    default_actions 
end 

Lassen Sie sich das seziert:

column("Name", nil, :sortable => :"people.name") {|star| star.person.name} 
  • der erste Parameter ist der Spaltentitel.
  • Die zweite wird nicht benötigt, da wir die Sortierung und den Wert überschreiben.
  • : sortierbar sagt Active Admin, wie das Ding zu sortieren ist. Dies ist der Tabellenname, da es in SQL geht.
  • Der Block teilt Active Admin mit, was als Zeilenwert zu verwenden ist.

Jetzt einige Filter hinzufügen.Dies ist viel einfacher:

filter :person_name, :as => :string 
filter :person_email, :as => :string 

Und du bist fertig.

Verwandte Themen