Изменение порядка сортировки по умолчанию в области ActiveAdmin

Для большинства моделей порядок сортировки по умолчанию (id desc) подходит. Но для пары областей в одной из моих моделей было бы более разумно изменить порядок или порядок по полю updated_at.

Кажется, я не могу достичь этого, не нарушив другие функции, поэтому я надеюсь, что кто-то еще может научить меня, как это сделать!

Я попытался добавить .order() к объектам, которые я возвращаю:

scope :example do |models|
  models.order('id asc')
end

Это, кажется, не имеет никакого эффекта.

Я также пробовал unscoping, который работает. Он сортирует мои объекты так, как я хочу, но полностью нарушает все функции фильтрации/поиска.

scope :example do |models|
  models.unscoped.order('id asc')
end

Что делать?

Ответ 1

используйте config.sort_order, например:

config.sort_order = "updated_at_desc"

Ответ 2

Почему бы не сделать 2 области в вашей модели, одну для определенного порядка сортировки, другую, отмененную, а затем в ActiveAdmin установить по умолчанию?

scope :example_asc, :default => true
scope :example_desc

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

controller do
  def asc
    Model.order('id ASC')
  end
  def desc
    Model.order('id DESC')
  end
end

scope :example do |models|
  asc
end

scope :example do |models|
  desc
end

И, наконец, я думаю, что этот ответ, вероятно, довольно точен: fooobar.com/questions/689880/...

Но вам может понадобиться больше узнать о том, как вы можете реализовать sort_order:

Для чего это стоит, я не поклонник ActiveAdmin тощих документов. Удачи.

Ответ 3

Вам необходимо использовать переупорядочение, чтобы переопределить порядок по умолчанию, но также необходимо учитывать, применяются ли сортировки ActiveAdmin.

scope :example do |models|
  if params[:order].blank? or params[:order] == "id_desc" #default ordering
    models.example.reorder('your order SQL here')
  else
    models.example
  end
end

Ответ 4

Это работает, а также гарантирует, что порядок сортировки по умолчанию правильно отражен в пользовательском интерфейсе.

Это перезаписывает метод apply_sorting в ActiveAdmin, поэтому применяются все обычные предостережения о внесении исправлений обезьянами сторонних гемов.

  module ActiveAdmin
    class ResourceController < BaseController
      module CallableSortOrder
        def apply_sorting(chain)
          params[:order] ||= if active_admin_config.sort_order&.respond_to?(:call)
                               active_admin_config.sort_order.call(self)
                             else
                               active_admin_config.sort_order
                             end
          super
        end
      end

      prepend CallableSortOrder
    end
  end

Используйте это так:

  config.sort_order = ->(controller) {
    controller.params[:scope] == 'something' ? 'created_at_desc' : 'name_asc'
  }