对于大多数模型,默认排序顺序 (id desc) 就可以了。但对于我的一个模型上的几个范围,颠倒顺序或按 update_at 字段排序会更有意义。
我似乎无法在不破坏其他功能的情况下实现这一目标,所以我希望其他人可以教我如何做到这一点!
我尝试在要返回的对象上添加 .order() :
scope :example do |models|
models.order('id asc')
end
这似乎没有任何效果。
我也尝试过取消范围,这很有效。它确实按照我想要的方式对我的对象进行排序,但它完全破坏了所有过滤/搜索功能。
scope :example do |models|
models.unscoped.order('id asc')
end
该怎么办?
使用 config.sort_order 如下:
config.sort_order = "updated_at_desc"
为什么不在模型中创建 2 个范围,一个用于特定排序顺序,另一个相反,然后在 ActiveAdmin 中将一个范围设置为默认值?
scope :example_asc, :default => true
scope :example_desc
如果这对您不起作用,也许可以在 ActiveAdmin 中创建一个控制器块来定义您要执行的操作:
controller do
def asc
Model.order('id ASC')
end
def desc
Model.order('id DESC')
end
end
scope :example do |models|
asc
end
scope :example do |models|
desc
end
最后,我认为这个答案可能相当准确:https://stackoverflow.com/a/17612718/175825
但是您可能想更多地了解如何实施
sort_order
:
就其价值而言,我不喜欢 ActiveAdmin 的精简文档。祝你好运。
这有效,并且还确保默认排序顺序正确反映在 UI 中。
这会覆盖 ActiveAdmin 的
apply_sorting
方法,因此所有有关猴子修补第三方 gem 的常见警告都适用。
module ActiveAdmin
class ResourceController < BaseController
module CallableSortOrder
def apply_sorting(chain)
params[:order] ||= if active_admin_config.sort_order&.respond_to?(:call)
active_admin_config.sort_order.call(self)
else
active_admin_config.sort_order
end
super
end
end
prepend CallableSortOrder
end
end
像这样使用它:
config.sort_order = ->(controller) {
controller.params[:scope] == 'something' ? 'created_at_desc' : 'name_asc'
}
@yxf 的答案是正确的,但我发现不清楚(“
config
从哪里来?!”)。
文档:https://activeadmin.info/3-index-pages.html(只需搜索“订单”)
代码:
ActiveAdmin.register Post do
config.sort_order = 'name_asc'
end
您需要使用重新排序来覆盖默认顺序,但也要注意是否应用 ActiveAdmin 排序
scope :example do |models|
if params[:order].blank? or params[:order] == "id_desc" #default ordering
models.example.reorder('your order SQL here')
else
models.example
end
end
这就是我最终的结果:
controller do
before_action :set_explicit_order, only: [:index]
def set_explicit_order
if params[:scope] == 'flagged'
params[:order] = 'flags_desc'
end
end
end