如何在Active Admin中为动态数据列添加排序功能
给计算生成的Average列添加排序功能
你当前设置sortable: true但排序不生效,是因为这个Average列是通过Ruby代码计算object.total/3得到的,并非数据库原生字段,ActiveAdmin无法直接识别其排序依据。解决方法分两种情况:
简单线性计算场景(如total/3)
因为total/3的排序逻辑和total字段完全一致(除以3不会改变数值的相对大小),直接把sortable的值指定为数据库里的:total字段即可:
index do selectable_column id_column column 'Average', sortable: :total do |object| object.total / 3 end end
点击表头时,会自动按照total字段的值排序,实现Average列的排序需求。
复杂计算场景
如果你的计算逻辑不是简单的线性转换(比如涉及多字段运算),需要在数据库层面先计算出该字段,再基于这个计算字段排序:
index do selectable_column id_column column 'Average', sortable: 'average' do |object| object.average end end controller do def scoped_collection # 在查询时通过SQL计算出average字段并别名 super.select('*, total / 3 as average') end end
这种方式让数据库提前完成计算,ActiveAdmin可以直接基于别名average进行排序,适用于更复杂的计算列场景。
内容的提问来源于stack exchange,提问作者VR_1
相关产品推荐
相关产品推荐

