2011-10-15 2 views
12

Sto avendo questi oggetti:ActiveAdmin: ordina per proprietà dell'associazione bambino

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

Quello che vorrei fare (e stato in grado di farlo finora), è: avere una colonna City in District 's indice e quella colonna dovrebbe essere ordinabile su City.name.

cosa più vicina che è stato in grado di fare, senza schiantarsi ActiveAdmin è:

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

Che ovviamente non è abbastanza buono; Non voglio ordinare il valore intero della chiave esterna.

Provato come :sortable => 'city.name', dà un errore. Anche provato a farlo come lo fai su "pure" Rails - :joins => :cities, :sortable => 'city.name' - senza fortuna. Ho provato un sacco di altre cose stupide, mi sono infastidito e ho deciso di chiedere umilmente aiuto.

Qualcuno può indicarmi la giusta direzione? Grazie per il tuo tempo.

+0

cosa ha fatto la tua soluzione .. – js111

risposta

20

Questo dovrebbe anche fare il lavoro:

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

Sì , molto meglio in realtà. – dimitarvp

+0

qualche idea su come ordinare per il conteggio dell'associazione? Vedi http://stackoverflow.com/questions/15924458/activeadmin-sort-by-association-count – AlexBrand

+0

@alexBrand, userei anche l'approccio della cache del contatore, come suggerito nelle risposte alla tua domanda. Saluti. –

2

Utilizzare il nome del tavolo, probabilmente cities. Potrebbe assomigliare a questo:

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

Lo so. Intendevo il DSL di ActiveAdmin, comunque. Fortunatamente, è stato risolto come 14 ore fa - https://github.com/gregbell/active_admin/pull/623 – dimitarvp

+0

Quando faccio questo, la colonna scompare ... – Slicekick

+1

cosa ha fatto la tua soluzione. – js111

9

Prova questo .. Essa vi aiuterà ....

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

soluzione molto semplice e leggibile :

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

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