如何将自定义排序应用于 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
我有一个带有名称和 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