如何将自定义排序应用于 Active Admin 中的列

How to apply custom sort to column in AcitveAdmin

我有一个带有名称和 release_date 属性的 Movie 模型,以及以下 ActiveAdmin 代码

ActiveAdmin.register Promotion do

  index do
    actions
    column :name
    column :release_date, sortable: :release_date
  end

end 

当我按 release_date desc 排序时,没有日期的条目冒泡到顶部。我希望这些条目始终位于底部,而不管排序顺序如何。有什么方法可以在对列进行排序时指定比较函数吗?

我建议重新定义你的问题。

ActiveAdmin 很难达到您的要求。因为 ActiveAdmin 的 order clause 非常严格:

clause =~ /^([\w\_\.]+)(->'\w+')?_(desc|asc)$/

因此您需要重新定义 ActiveAdmin::OrderClause class 以接受 NULL LAST 或您的数据库系统支持的任何内容,或者只接受 ActiveAdmin 的工作方式。

我认为必须添加一个带有计数缓存的显式列来解决这个问题对于所需的东西来说太过分了。为什么不将控制器中的 #scoped_collection 查询更新为 select 一个额外的列?如果它在范围内(例如对于当前查询),您可以通过 DSL 访问它。

ActiveAdmin.register Foo do 
  index do
    column :things_count, sortable: :things_count
  end

  controller do 
    def scoped_collection
      super.select('foo.*, COUNT(things.id) as things_count').group('foo.id')
    end
  end
end