11

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

如果不破坏其他功能,我似乎无法实现这一点,所以我希望其他人可以教我如何做到这一点!

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

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

这似乎没有任何效果。

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

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

该怎么办?

4

4 回答 4

10

使用 config.sort_order 像:

config.sort_order = "updated_at_desc"
于 2013-07-12T10:21:06.347 回答
5

为什么不在模型中创建 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 的瘦文档。祝你好运。

于 2013-12-13T17:16:42.163 回答
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
于 2017-03-24T00:30:23.550 回答
0

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

这是覆盖apply_sortingActiveAdmin 的方法,因此所有关于猴子修补第三方 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'
  }
于 2019-05-12T22:23:41.423 回答