2011-10-15 33 views
12

Tôi gặp các đối tượng:ActiveAdmin: Sắp xếp theo tài sản gắn con của

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

Những gì tôi muốn làm (và đã không thể làm như vậy cho đến nay), là: có một cột City trong District 's chỉ mục và cột đó có thể được sắp xếp theo số City.name.

điều gần nhất tôi đã có thể làm mà không bị rơi ActiveAdmin là:

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

Trong đó tất nhiên là không đủ tốt; Tôi không muốn sắp xếp giá trị số nguyên của khóa ngoại.

Đã thử các công cụ như :sortable => 'city.name', đưa ra lỗi. Ngay cả cố gắng để làm điều đó như bạn làm điều đó trên "tinh khiết" Rails - :joins => :cities, :sortable => 'city.name' - không may mắn. Đã thử một loạt các công cụ ngu ngốc khác, đã khó chịu và quyết định khiêm tốn yêu cầu giúp đỡ.

Có ai có thể chỉ cho tôi đúng hướng không? Cảm ơn bạn đã dành thời gian.

+0

giải pháp của bạn kết thúc là gì .. – js111

Trả lời

20

Đó cũng nên làm việc:

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

Có , tốt hơn rất nhiều. – dimitarvp

+0

bất kỳ ý tưởng nào về cách sắp xếp theo số lượng liên kết? Xem http://stackoverflow.com/questions/15924458/activeadmin-sort-by-association-count – AlexBrand

+0

@alexBrand, tôi cũng sẽ sử dụng phương pháp tiếp cận bộ nhớ cache truy cập, như được đề xuất trong câu trả lời cho câu hỏi của bạn. Chúc mừng. –

2

Sử dụng tên của bảng, có thể là cities. Nó có thể trông như thế này:

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

Tôi biết điều này. Tôi có nghĩa là ActiveAdmin của DSL, mặc dù. Hạnh phúc, nó đã được cố định như 14 giờ trước - https://github.com/gregbell/active_admin/pull/623 – dimitarvp

+0

Khi tôi làm điều này, cột biến mất ... – Slicekick

+1

giải pháp của bạn kết thúc là gì .. – js111

9

Hãy thử điều này .. Nó sẽ giúp ....

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

giải pháp Rất đơn giản và dễ đọc :

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

controller do 
    def scoped_collection 
    # join cities 
    super.includes :city 
    end 
end 
Các vấn đề liên quan