Подтвердить что ты не робот

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

Спасибо!

4b9b3361

Ответ 1

Fixed

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

Ответ 2

в соответствии с этим обсуждением: 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

Ответ 3

Да, программа 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

Ответ 4

Это можно сделать.

Здесь у меня есть модель под названием Star. Звезда принадлежит человеку. Я собираюсь поместить 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

Теперь, чтобы добавить имя человека из модели join в мой звездный индекс, я делаю это:

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

И все готово.