2012-06-21 4 views
12

Zajmuję się tworzeniem aplikacji ActiveAdmin i chcę posortować kolumnę firm według ich "typu". Niestety mój kod nie działa. Jaki kod powinienem użyć, aby to osiągnąć? Tu jest mój kod ...ActiveAdmin sposób sortowania kolumny z powiązaniami

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 

Dzięki!

+0

Ktoś? Wciąż stoję przed tą blokadą ... – Slicekick

Odpowiedz

8

STAŁĄ

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

+2

W pytaniu stawiasz tę samą linię ... – dusan

+1

Nie rozumiem? To jest to samo co powyżej? – cjm2671

18

według tej dyskusji: https://github.com/gregbell/active_admin/pull/623, jeśli nie chcesz korzystać z zakresów, można użyć scoped metodę gromadzenia Zamiast:

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

.. i działa idealnie dla mnie :) –

+0

to powinieneś zagłosować! :) – Rimian

+0

Być może będziesz musiał połączyć '.references (: type)' after 'includes (: type)', aby uzyskać dołączenie do nowszych wersji ActiveRecord. – ahmacleod

4

Tak , scoped_collection dostarczone przez Evgenia działa świetnie. Również dla więcej niż jednej kolumny:

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

Można to zrobić.

Tutaj mam model o nazwie Star. Gwiazda należy do Osoby. Zamierzę Person.name w indeksie administratora Star, sprawię, że będzie to sortowalne, sprawi, że będzie działać z zakresami i doda filtry.

Najpierw musisz dodać model łączenia do każdego ze swoich zakresów. W tym przypadku miałem 3 zakresy: wszystkie, category_subscriptions i person_subscriptions. Jestem deklarując zakresy i dodanie modelu dołączyć do nich:

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 

Teraz, aby dodać nazwę osoby z modelu dołączyć do mojego indeksu gwiazdy I to zrobić:

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 

Niech wnikliwie, że:

column("Name", nil, :sortable => :"people.name") {|star| star.person.name} 
  • pierwszym parametrem jest nazwa kolumny.
  • Druga część nie jest potrzebna, ponieważ sortujemy wartości nadrzędne i wartość.
  • : sortable mówi aktywnemu administratorowi, jak sortować rzeczy. To jest nazwa tabeli, ponieważ przechodzi do SQL.
  • Blok informuje Active Admin, co należy użyć jako wartość wiersza.

Teraz, aby dodać filtry.Jest to znacznie łatwiejsze:

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

I gotowe.