ActiveAdmin - 组合范围和过滤器
ActiveAdmin - Combining Scope and Filter
我有一个 ActiveAdmin 实例,其中有 User
个 has_many
Thing
个。我还希望允许用户通过使用 Employments
关联到其他 User
使用自我引用 has_many 充当其他 User
的 Thing
的管理员模型。模型看起来像这样...
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
所以这无论如何都达到了我想要的效果。
我有一个 ActiveAdmin 实例,其中有 User
个 has_many
Thing
个。我还希望允许用户通过使用 Employments
关联到其他 User
使用自我引用 has_many 充当其他 User
的 Thing
的管理员模型。模型看起来像这样...
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
所以这无论如何都达到了我想要的效果。