active_admin配置.排序两列



我有一个名为shows的active_admin表,该表显示了自行车骑手和自行车的回复列表,显示了骑手将参加比赛。 以下代码按rider_last_name字母顺序正确排序表:

config.sort_order = 'rider_last_name_asc'

现在,当骑手参加多个自行车展时,我希望表格首先按rider_last_name排序,然后在该骑手中按称为start_time的属性shows排序。 start_time是日期时间。 根据这篇堆栈溢出文章,以下内容应该有效:

config.sort_order = 'rider_last_name_asc, start_time_asc'

但事实并非如此。 实际上,它撤消了按rider_last_name排序。 如何按两列排序?

您可以

尝试优化集合apply_sorting方法,如下所示:

controller do
  def apply_sorting(chain)
    params[:order] ? chain : chain.reorder(rider_last_name: :asc, start_time: :asc)
  end
end

ActiveAdmin 建议覆盖 find_collection 方法,该方法返回一个ActiveRecord::Relation。但我更喜欢将order添加到它的输出中。

ActiveAdmin.register Show do
  controller do
    def find_collection(options = {})
      super.reorder(rider_last_name: :asc, start_time: :asc)
    end
  end
  ...
end

尽管它有效,但这会覆盖单击列的用户选项。

另类

你可以对scoped_collection做同样的事情,它在find_collection开始时调用,但除非你向控制器添加active_admin_config.sort_order = '',否则它不起作用。这边:

controller do
  active_admin_config.sort_order = ''
  def scoped_collection
    super.reorder(rider_last_name: :asc, start_time: :asc)
  end
end

现在,如果我们想在此之前和之后重新排序,请照顾用户参数(并且不要覆盖它们(。这就是方式。

注意:我确实使用了active_admin_config.sort_order而不是config.sort_order

此外,sort_order 选项以OrderClause.new调用的参数结束,该参数仅包含一个排序字段,请参阅此处和此处。

您可以尝试将数组传递给它,如下所示:

config.sort_order = [:rider_last_name_asc, :start_time_asc]

最新更新