我对动态活动管理范围有疑问。我试图为我的应用程序中“项目”的每个“经理”创建一个范围。但是,当创建新的经理(或分配给项目)时,范围似乎不会更新,但如果我重新启动服务器,它们会更新。所以代码本身“有效”,但显然不是按照我希望的方式。我是一个 ruby/rails 菜鸟,所以我不确定是否需要做一些事情以某种方式“刷新”范围。
仅供参考,我在 Heroku Cedar 上使用 Rails 3.2 和 ActiveAdmin
这是有问题的代码(可以工作,但仅在服务器重新启动后引入新的管理器):
Manager.find_each do |m|
scope m.first_name do |projects|
projects.where(:manager_id => m.id)
end
end
以及整个 Active Admin 项目模型:
ActiveAdmin.register Project do
menu :priority => 1
index do
column :name
column :company_name
column :status
column :projection do |project|
number_to_currency project.projection
end
column :updated_at
default_actions
end
scope :all
scope :working, :default => true do |projects|
projects.where(:status => 'working')
end
Manager.find_each do |m|
scope m.first_name do |projects|
projects.where(:manager_id => m.id)
end
end
end
这是此问题的实际解决方案...尽管使用过滤器更理想的稳定性和维护性,但这在 ActiveAdmin 中看起来更好,并且更加用户友好,因为范围变成了漂亮的选项卡。
这有点像黑客,但在适当的情况下它是一个可行的解决方案:
诀窍是更新控制器索引操作的 before_filter 中的范围.
如果您在资源上创建了许多范围,这可能会变得很糟糕(尽管您可以轻松设置一些限制)
ActiveAdmin.register Project do
menu :priority => 1
index do
column :name
column :company_name
column :status
column :projection do |project|
number_to_currency project.projection
end
column :updated_at
default_actions
end
scope :all
scope :working, :default => true do |projects|
projects.where(:status => 'working')
end
controller do
before_filter :update_scopes, :only => :index
def update_scopes
resource = active_admin_config
Manager.all.each do |m|
next if resource.scopes.any? { |scope| scope.name == m.first_name }
resource.scopes << (ActiveAdmin::Scope.new m.first_name do |projects|
projects.where(:manager_id => m.id)
end)
end
# try something like this for deletions (untested)
resource.scopes.delete_if do |scope|
!(Manager.all.any? { |m| scope.name == m.first_name } || ['all', 'working'].include?(scope.name)) # don't delete other scopes you have defined
end
end
end
end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)