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

时间:2013-07-12 07:59:09

标签: ruby-on-rails activeadmin

对于大多数型号,默认排序顺序(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 个答案:

答案 0 :(得分:6)

使用config.sort_order,如:

config.sort_order = "updated_at_desc"

答案 1 :(得分:4)

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

答案 2 :(得分: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

答案 3 :(得分:0)

这有效,并且还可以确保默认排序顺序正确反映在用户界面中。

这将覆盖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'
  }