14

我正在开发一个 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

谢谢!

4

5 回答 5

21

根据这个讨论: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
于 2013-01-31T09:06:07.877 回答
8

固定的

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

于 2012-06-24T20:57:45.470 回答
4

是的,Evgenia 提供的 scoped_collection 效果很好。对于不止一列:

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
于 2013-02-15T02:47:44.063 回答
4

这是可以做到的。

在这里,我有一个名为 Star 的模型。一颗星属于一个人。我将把 Person.name 放在 Star 管理索引中,使其可排序,使其适用于范围,并添加过滤器。

首先,您必须将连接模型添加到每个范围。在这种情况下,我有 3 个范围:all、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}
  • 第一个参数是列标题。
  • 第二个是不需要的,因为我们覆盖了排序和值。
  • :sortable 告诉 Active Admin 如何对事物进行排序。这是表名,因为它要进入 SQL。
  • 该块告诉 Active Admin 使用什么作为行值。

现在添加一些过滤器。这要容易得多:

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

你完成了。

于 2013-05-15T12:16:09.110 回答
1

根据您的需要,这是我用于排序、默认索引和过滤的实现:

ActiveAdmin.register Business do
  index do
    column :name
    column :type, :sortable => 'businesses.type'
    column :manager
    column :email
    default_actions
  end

  controller do
    def scoped_collection
      super.includes(:businesses)
    end
  end
end

以防万一您想知道当您拥有更多级别的关联时如何排序,这就是我处理的方式,例如:

class TechResult < ActiveRecord::Base
  belongs_to :user
end

class User < ActiveRecord::Base
  belongs_to :organization
end

class Organization < ActiveRecord::Base
  has_many :users
end

然后在您的 tech_results 部分中,您要呈现一个组织字段,在我的情况下,tech_result.user.organization.name这是对它们进行排序的方法:

ActiveAdmin.register TechResult do
  config.batch_actions = false
  permit_params :user_id

  preserve_default_filters!

  index do
    column :id
    column 'user', sortable: 'users.name' do |tr|
      tr.user.name
    end
    column 'organization', nil, sortable: 'organizations.name' do |tr|
      tr.user.organization.name.titleize if tr.user.organization
    end

  end

  controller do
    def scoped_collection
      super.includes(user: [:organization])
    end
  end
end
于 2018-10-08T20:46:28.147 回答