2015-11-12 2 views
1

У меня есть требование сортировать/фильтровать столбец в представлении ActiveAdmin. Столбец - это подсчет субобъекта. В частности, модель выглядит следующим образом:Индекс ActiveAdmin - сортировать или фильтровать по столбцу count?

class Location < ActiveRecord::Base 
... 
has_many :things 
... 

страница ActiveAdmin должна иметь столбец для этого, который я имею, как это:

column 'Thing Count', :sortable => 'Thing Count' do |location| 
    location.things.length 
end 

Однако сортировка фактически не работает, и у меня есть не удалось найти способ сделать работу по фильтрации. Я пробовал несколько вариантов:

:filter 'Thing Count' 

не имеет успеха. Кто-нибудь когда-либо успешно получал ActiveAdmin для сортировки или фильтрации столбца count под-объектов? Если да, то как? Благодаря!

ответ

1

ActiveAdmin может иметь фильтры только для столбцов базы данных.

Вы можете сделать следующее:

  1. Сделать counter_cache колонки на модели/Thing belongs_to стороны.
  2. Сделайте фильтр для этой колонки filter :things_count
  3. Пересчитать счетчик для каждой вещи.

Пример:

def up 
    add_column :projects, :tasks_count, :integer, :default => 0 

    Project.reset_column_information 
    Project.find(:all).each do |p| 
    Project.update_counters p.id, :tasks_count => p.tasks.length 
    end 
end 

def down 
    remove_column :projects, :tasks_count 
end 
+0

Нет кости. Я сделал это: 'belongs_to: location, counter_cache: true', а затем добавил столбец и фильтр' things_count' на страницу, но все значения пустые, и фильтр не появляется. –

+0

Я обновил свой ответ –

+0

А я вижу. Я думаю, что сейчас он работает. Итак, в основном, мне нужно было подсчитать счетчик для всех существующих элементов, тогда изменение модели будет поддерживать его актуальность, правильно? Выглядит хорошо, спасибо! –

0
class Location 
    has_many :things 

    def self.all_things 
    joins(:things).select("locations.id as loc_id, count(things.*) as count").group("locations.id").order("count(things.*)") 
    end 
end 
+0

Ум, чтобы [объяснить свое решение] (http://stackoverflow.com/help/how-to-answer) немного? –

Смежные вопросы