在ActiveAdmin范围内更改默认排序顺序

14

对于大多数模型来说,默认的排序顺序(id desc)是可以的。但是对于我其中一个模型上的几个作用域,倒序排列或按updated_at字段排序会更有意义。

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

我已经尝试在我返回的对象上添加一个.order():

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

看起来这似乎没有任何效果。

我还尝试了取消作用域,有点奏效。它确实按照我想要的方式对我的对象进行了排序,但是它完全破坏了所有的筛选/搜索功能。

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

该怎么办?


@beck03076 这个评论完全没有建设性。如果你没有他的问题的答案,就不需要进行恶意攻击。 - Pierre-Louis Gottfrois
1
@rogerkk https://github.com/gregbell/active_admin/issues/312 - ahmet
谢谢@ahmet,我在谷歌上搜索时没有发现这个问题。我现在已经尝试了那里的建议,但排序顺序仍然被某种方式覆盖了。 - rogerkk
我还注意到我的活动管理作用域生成的链接在索引页面上URL中都有 "order=id_desc"。我不知道这是从哪里来的,但似乎删除URL中的这部分没有任何影响。 - rogerkk
5个回答

14

使用 config.sort_order 如下:

config.sort_order = "updated_at_desc"

7
据我所了解,这会改变所有范围的排序顺序。我希望其中一些以不同的方式排序。 - rogerkk
ActiveAdmin 注册模型:ActiveAdmin.register Model do config.sort_order = 'updated_at_desc' ... end不一定要将其添加到 ActiveAdmin 注册模块中。 - ngelx
1
这让我有点疯狂,但文档很清晰(只需搜索“order”):https://activeadmin.info/3-index-pages.htmlActiveAdmin.register Post do config.sort_order = 'name_asc' end - Narfanator

6
为什么不在你的模型中创建两个范围,一个按特定排序方式,另一个按相反顺序,然后在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://dev59.com/e2Mm5IYBdhLWcg3wburb#17612718 但是您可能需要更多地了解如何实现sort_order 就我所知,我不喜欢ActiveAdmin的简化文档。祝好运。

3

这样做可以确保默认的排序顺序在UI中正确显示。

这是重写了ActiveAdmin的apply_sorting方法,因此所有关于猴子补丁第三方宝石的警告都适用。

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

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

2
这个解决方案的问题是,不幸的是它让我无法通过用户界面手动按任何其他列进行排序。 - rogerkk
1
18个月后...我又开始谷歌这个问题,并终于找到了解决方案。以上答案已更新。 - millie
这个答案的一个缺点是UI仍然反映默认排序顺序。 - Sam Stickland

1

@yxf的回答是正确的,但我发现它不够清晰(“config从哪里来?!”)。

文档:https://activeadmin.info/3-index-pages.html(搜索“order”即可)

代码:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接