对于大多数型号,默认排序顺序(id desc)都可以。但是对于我的一个模型上的几个范围,反转顺序或者更新updated_at字段更有意义。
我似乎无法在不破坏其他功能的情况下实现这一目标,所以我希望别人可以教我如何做到这一点!
我尝试在我正在返回的对象上添加.order():
scope :example do |models|
models.order('id asc')
end
这似乎没有任何效果。
我也尝试了解开,哪种作品。它按照我想要的方式对对象进行排序,但它完全打破了所有过滤/搜索功能。
scope :example do |models|
models.unscoped.order('id asc')
end
怎么办?
答案 0 :(得分:6)
使用config.sort_order,如:
config.sort_order = "updated_at_desc"
答案 1 :(得分:4)
为什么不在模型中制作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的瘦文档的粉丝。祝你好运。
答案 2 :(得分:1)
您需要使用重新排序来覆盖默认顺序,但对于是否正在应用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
答案 3 :(得分:0)
这有效,并且还可以确保默认排序顺序正确反映在用户界面中。
这将覆盖ActiveAdmin的apply_sorting
方法,因此所有有关猴子修补第三方宝石的常见警告都适用。
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'
}