更改 ActiveAdmin 范围中的默认排序顺序

问题描述 投票:0回答:6

对于大多数模型,默认排序顺序 (id desc) 就可以了。但对于我的一个模型上的几个范围,颠倒顺序或按 update_at 字段排序会更有意义。

我似乎无法在不破坏其他功能的情况下实现这一目标,所以我希望其他人可以教我如何做到这一点!

我尝试在要返回的对象上添加 .order() :

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

这似乎没有任何效果。

我也尝试过取消范围,这很有效。它确实按照我想要的方式对我的对象进行排序,但它完全破坏了所有过滤/搜索功能。

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

该怎么办?

ruby-on-rails activeadmin
6个回答
15
投票

使用 config.sort_order 如下:

config.sort_order = "updated_at_desc"

6
投票

为什么不在模型中创建 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

最后,我认为这个答案可能相当准确:https://stackoverflow.com/a/17612718/175825

但是您可能想更多地了解如何实施

sort_order

就其价值而言,我不喜欢 ActiveAdmin 的精简文档。祝你好运。


5
投票

这有效,并且还确保默认排序顺序正确反映在 UI 中。

这会覆盖 ActiveAdmin 的

apply_sorting
方法,因此所有有关猴子修补第三方 gem 的常见警告都适用。

  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'
  }

3
投票

@yxf 的答案是正确的,但我发现不清楚(“

config
从哪里来?!”)。

文档:https://activeadmin.info/3-index-pages.html(只需搜索“订单”)

代码:

ActiveAdmin.register Post do
  config.sort_order = 'name_asc'
end

1
投票

您需要使用重新排序来覆盖默认顺序,但也要注意是否应用 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

0
投票

这就是我最终的结果:

controller do
  before_action :set_explicit_order, only: [:index]

  def set_explicit_order
    if params[:scope] == 'flagged'
      params[:order] = 'flags_desc'
    end
  end
end
© www.soinside.com 2019 - 2024. All rights reserved.