Ответ 1
используйте config.sort_order, например:
config.sort_order = "updated_at_desc"
Для большинства моделей порядок сортировки по умолчанию (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
Что делать?
используйте config.sort_order, например:
config.sort_order = "updated_at_desc"
Почему бы не сделать 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 тощих документов. Удачи.
Вам необходимо использовать переупорядочение, чтобы переопределить порядок по умолчанию, но также необходимо учитывать, применяются ли сортировки 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
Это работает, а также гарантирует, что порядок сортировки по умолчанию правильно отражен в пользовательском интерфейсе.
Это перезаписывает метод 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'
}