2011-10-15 11 views
12

estoy teniendo estos objetos:ActiveAdmin: ordenar por la propiedad de la asociación infantil

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

Lo que me gusta hacer (y ha sido incapaz de hacerlo hasta ahora), es: tiene una columna City en District 's el índice y esa columna deben poder clasificarse en City.name.

lo más parecido que era capaz de hacer sin que se caiga ActiveAdmin es:

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

que por supuesto no es lo suficientemente bueno; No quiero clasificar el valor entero de la clave foránea.

Probado cosas como :sortable => 'city.name', da un error. Incluso intenté hacerlo como si lo hiciera en Rails "puros" - :joins => :cities, :sortable => 'city.name' - sin suerte. Intenté un montón de otras cosas estúpidas, me enojé y decidí pedir humildemente ayuda.

¿Alguien puede indicarme la dirección correcta? Gracias por su tiempo.

+0

¿cuál fue tu solución? – js111

Respuesta

20

que también deben hacer el trabajo:

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í mucho mejor en realidad – dimitarvp

+0

alguna idea sobre cómo ordenar por el recuento de la asociación? Consulte http://stackoverflow.com/questions/15924458/activeadmin-sort-by-association-count – AlexBrand

+0

@alexBrand, también usaría el enfoque de contador de caché, como se sugiere en las respuestas a su pregunta. Aclamaciones. –

2

Utilice el nombre de la tabla, probablemente cities. Se podría tener este aspecto:

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

Sé esto. Me refiero a DSL de ActiveAdmin, sin embargo. Afortunadamente, se arregló como hace 14 horas - https://github.com/gregbell/active_admin/pull/623 – dimitarvp

+0

Cuando hago esto, la columna desaparece ... – Slicekick

+1

cuál fue tu solución ... – js111

9

Prueba esto .. Esto ayudará ....

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

solución muy simple y fácil de leer :

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

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