我在rails 4.2 app中使用active-admin(AA,1.0.0)。我正在显示在线用户列表。我想添加'范围'这样,不同类型用户的链接及其计数显示在主列表上方。
ActiveAdmin.register User do
menu parent: "Users", label: "Online Users", url: '/ admin/users/online_users'
collection_action :online_users, method: :get do
@users = User.select{|i| i.online?}
end
belongs_to :organization, optional: true
scope :all, default: true
scope :admins do |users| users.with_role(:admin) end
scope :type1 do |users| users.with_role(:type1) end
scope :type2 do |users| users.with_role(:type2) end
end
列表显示但范围不是。我错过了什么?
答案 0 :(得分:1)
您应该使用collection_action
来限制您对在线用户的关注,而不是使用scoped_collection
来获取您想要的子集合。这样,其他所有内容都可以正常运行。
理想情况下,您的users
表将有一个online
布尔列,在这种情况下,添加一个简单的where
子句就可以了。如果没有,即online?
是无法查询的计算方法,那么您首先需要计算在线用户id
的集合。这不会很好地扩展,所以要小心。
ActiveAdmin.register User do
menu parent: "Users", label: "Online Users", url: '/admin/users/online_users'
controller do
def scoped_collection
# if online is a boolean column (best performance):
super.where(online: true)
# if online is a computed method (convert to ActiveRecord::Relation):
# ids = User.all.select(&:online?).map(&:id)
# super.where(id: ids)
end
end
belongs_to :organization, optional: true
scope :all, default: true
scope :admins, -> (u) { u.with_role(:admin) }
scope :type1, -> (u) { u.with_role(:type1) }
scope :type2, -> (u) { u.with_role(:type2) }
end
您也可以使用普通users
管理员路径上的过滤器来实现此目的(假设您有一个过滤器)。