簡體   English   中英

ActiveAdmin-合並范圍和篩選器

[英]ActiveAdmin - Combining Scope and Filter

我有一個ActiveAdmin實例,其中有具有has_many ThingUser 我也希望讓用戶來充當管理者對其它UserThing S使用自我指涉的has_many通過關聯其他User使用Employments模式。 這些模型看起來像這樣...

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相同的問題-將范圍與過濾器一起使用 ,但由於我們的關聯非常不同,因此我認為此解決方案不適用於我。

emI找到了一個可行的解決方案,盡管它並沒有真正解決混合示波器和過濾器的問題。

我沒有創建托管范圍,而是創建了新的名稱空間

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頁面(管理員鏈接適用於站點管理員)...

然后,對於管理器名稱空間中的事物 ,我覆蓋了控制器以僅管理事物。

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

因此,無論如何,這還是我一直在尋找的影響。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM