活动管理员和过滤器无法正常工作

时间:2015-09-25 14:00:50

标签: ruby-on-rails-4 activeadmin

我在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

列表显示但范围不是。我错过了什么?

1 个答案:

答案 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管理员路径上的过滤器来实现此目的(假设您有一个过滤器)。