2012-06-21 25 views
12

我正在開發ActiveAdmin應用程序,並且我想按其「類型」對企業列進行排序。不幸的是,我的代碼不工作。我應該用什麼代碼來實現這個目標?這裏是我的代碼...ActiveAdmin如何使用關聯對列進行排序

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 

謝謝!

+0

有人嗎?我仍然面臨着這個障礙...... – Slicekick

回答

8

FIXED

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

+2

在你的問題中,你把同一條線... – dusan

+1

我不明白嗎?這和上面一樣嗎? – cjm2671

18

根據這個討論:https://github.com/gregbell/active_admin/pull/623,如果你不想使用範圍,可以使用範圍的收集方法來代替:

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

..它適用於我:) –

+0

那麼你應該投票了! :) – Rimian

+0

爲了在更新版本的ActiveRecord中獲得連接,可能必須在'includes(:type)'之後鏈接'.references(:type)'。 – ahmacleod

4

是,scoped_collection Evgenia提供的工作非常棒。也可用於多列:

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

這可以完成。

在這裏我有一個名爲星的模型。一顆星星屬於一個人。我將把Person.name放在Star管理索引中,使它可以排序,使它適用於作用域,並添加過濾器。

首先,您必須將連接模型添加到每個範圍。在這種情況下,我有3個範圍:所有,category_subscriptions和person_subscriptions。我聲明範圍和添加的聯接模型對他們說:

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 

我們從加盟模式添加的聯繫人名字進入我的明星指數我這樣做:

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 

讓我們來剖析如下:

column("Name", nil, :sortable => :"people.name") {|star| star.person.name} 
  • 第一個參數是列標題。
  • 第二個是不需要的,因爲我們正在重寫排序和價值。
  • :可排序告訴活動管理員如何排序的東西。這是表名,因爲它將進入SQL。
  • 該塊告訴Active Admin將哪些用作行值。

現在添加一些過濾器。這很容易:

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

然後你就完成了。

相關問題