2011-10-15 13 views
12

Mam następujące obiekty:ActiveAdmin sort majątek stowarzyszenia podrzędnego

class District < ActiveRecord::Base 
    belongs_to :city 
end 
class City < ActiveRecord::Base 
    has_many :districts 
end 

Co chciałbym zrobić (i był w stanie to zrobić do tej pory), to: mieć kolumnę District „s City indeks i ta kolumna powinna być sortowalna na City.name.

najbliższą rzeczą udało mi się zrobić bez awarii ActiveAdmin jest:

index do 
    column City.human_name(:count => :other), :city, :sortable => :city_id 
end 

Co oczywiście nie jest wystarczająco dobry; Nie chcę sortować na wartość całkowitą klucza obcego.

Wypróbowane rzeczy, takie jak :sortable => 'city.name', powoduje błąd. Nawet próbował to zrobić tak, jak robisz to na "czystych" Railsach - :joins => :cities, :sortable => 'city.name' - bez powodzenia. Wypróbował kilka innych głupich rzeczy, denerwował się i postanowił pokornie poprosić o pomoc.

Czy ktoś może wskazać mi właściwy kierunek? Dziękujemy za poświęcony czas.

+0

jakie było Twoje rozwiązanie .. – js111

Odpowiedz

20

To powinno również wykonać pracę:

index do 
    column City.model_name.human, :city, :sortable => 'cities.name' 
end 

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

Tak dużo lepiej. – dimitarvp

+0

wszelkie pomysły na sortowanie według liczby skojarzeń? Zobacz http://stackoverflow.com/questions/15924458/activeadmin-sort-by-association-count – AlexBrand

+0

@alexBrand, użyłbym również podejścia licznika pamięci podręcznej, jak zasugerowano w odpowiedziach na twoje pytanie. Twoje zdrowie. –

2

Użyj nazwy tabeli, prawdopodobnie cities. To może wyglądać następująco:

District.joins(:city).order("cities.name") 
+2

Wiem to. Chodzi mi o DSL ActiveAdmina. Szczęśliwie, zostało to naprawione jak 14 godzin temu - https://github.com/gregbell/active_admin/pull/623 – dimitarvp

+0

Kiedy to zrobię, kolumna zniknie ... – Slicekick

+1

jakie było twoje rozwiązanie .. – js111

9

Spróbuj .. Pomoże ....

index do 
    column :city, :sortable => :"cities.name" do |district| 
    district.city.human_name(:count => :other) if district.city.present? 
    end 
end 

controller do 
    def scoped_collection 
    District.includes(:city) 
    end 
end 
2

bardzo proste i czytelne rozwiązanie :

index do 
    column :city, sortable: "cities.name" 
end 

controller do 
    def scoped_collection 
    # join cities 
    super.includes :city 
    end 
end