ActiveAdmin - 组合范围和过滤器

ActiveAdmin - Combining Scope and Filter

我有一个 ActiveAdmin 实例,其中有 Userhas_many Thing 个。我还希望允许用户通过使用 Employments 关联到其他 User 使用自我引用 has_many 充当其他 UserThing 的管理员模型。模型看起来像这样...

class User < ActiveRecord::Base
    ...

    has_many :things, dependent: :destroy


    has_many :employments, foreign_key: 'employer_id', dependent: :destroy
    has_many :employees, through: :employments
    has_many :inverse_employments, class_name: 'Employment', foreign_key: 
                  'employee_id', dependent: :destroy
   has_many :employers, through: :inverse_employments

   accepts_nested_attributes_for :employments, allow_destroy: true

   ...
end

class Employments < ActiveRecord::Base
    belongs_to :employer, :class_name => 'User'
    belongs_to :employee, :class_name => 'User'

    # Also has other metadata attributes
end

class Thing < ActiveRecord::Base
    belongs_to :user
end

在 ActiveAdmin 中,我希望用户能够管理他们自己的事物以及其他用户的事物。我已经设置了范围和过滤器如下

ActiveAdmin.register Thing do
    ...

    scope_to :current_user

    scope 'Owned', :all, default: true do
      Rezzable::Pinger.where(user_id: current_user.id)
    end

    scope :managed do
      Rezzable::Pinger.where(user_id: Employment.where(employee_id: 
          current_user.id).collect{ |e| e.employer_id })
    end
end

范围界定很有效,但过滤器却不起作用。如果我删除范围过滤器工作正常。我还致力于创建一个过滤器,只显示托管或拥有的物品,但事实证明,洗劫协会也很困难,因为拥有的事物的关联是直接的,但另一个必须通过就业和获得雇主的事物来完成。

有没有办法让范围和过滤器很好地协同工作?如果做不到这一点,是否有替代的、也许更好的方法来实现这一目标?提前致谢。

PS - 我认为这与 ActiveAdmin - Using scopes with filters 是同一个问题,但我不认为这个解决方案对我有用,因为我们的关联非常不同。

em我找到了一个可行的解决方案,尽管它并没有真正解决混合示波器和过滤器的问题。

我没有创建 managed 作用域,而是创建了一个新的命名空间

config/initializers/active_admin.rb

config.namespace :my do |my|
  my.authentication_method = :authenticate_user!
  my.current_user_method = :current_user
  my.build_menu :utility_navigation do |menu|
    menu.add label: proc{ "#{display_name current_user.name} - My Stuff" },
           url: proc { my_dashboard_path },
           id: 'current_user',
           priority: 1,
           if: proc { current_user.can_be_user? }
    menu.add label: 'Admin Dashboard',
           url: proc { admin_dashboard_path },
           if: proc { current_user.can_be_admin? }
    menu.add label: 'Manager Dashboard',
           url: proc { manager_dashboard_path },
           if: proc { current_user.employers.size > 0 }
    my.add_logout_button_to_menu menu
  end
end

config.namespace :manager do |manager|
  manager.authentication_method = :authenticate_user!
  manager.current_user_method = :current_user
  manager.build_menu :utility_navigation do |menu|
    menu.add label: proc{ "#{display_name current_user.name} -My Stuff" },
           url: proc { my_dashboard_path },
           id: 'current_user',
           priority: 1,
           if: proc { current_user.can_be_user? }
    menu.add label: 'Admin Dashboard',
           url: proc { admin_dashboard_path },
           if: proc { current_user.can_be_admin? }
    manager.add_logout_button_to_menu menu
  end
end

并根据需要添加到其他命名空间的菜单链接,以便可以访问管理器页面(管理链接供站点管理员使用)...

然后对于 manager 命名空间中的 Things 我覆盖了控制器以仅获取事情管理。

ActiveAdmin.register Thing, namespace: :manager do

controller do
  def scoped_collection
    Thing.where( user_id: current_user.employers.collect { |e| e.user_id } )
  end
end

所以这无论如何都达到了我想要的效果。