两列的active_admin config.sort

时间:2015-10-08 18:15:33

标签: ruby-on-rails activerecord activeadmin

我有一个名为shows的active_admin表,其中列出了自行车骑手和自行车表演的rsvps列表,车友们将参与竞争。以下代码正确地按rider_last_name字母顺序对表格进行排序:< / p>

config.sort_order = 'rider_last_name_asc'

现在,当骑手参加多个自行车表演时,我希望表首先按rider_last_name排序,然后在该骑手中按shows属性start_time进行排序。 start_time是DateTime。根据{{​​3}},以下内容应该有效:

config.sort_order = 'rider_last_name_asc, start_time_asc'

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

3 个答案:

答案 0 :(得分:3)

您可以尝试为集合细化 apply_sorting 方法,如下所示:

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

答案 1 :(得分:1)

ActiveAdmin suggests覆盖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调用的参数结束,只需要一个排序字段,请参阅herehere

答案 2 :(得分:0)

您可以尝试将数组传递给它:

config.sort_order = [:rider_last_name_asc, :start_time_asc]