ruby-on-rails - 相关模型的每个实例的事件管理范围

标签 ruby-on-rails ruby heroku activeadmin

我对动态事件管理范围有疑问。我正在尝试为我的应用程序中的“项目”的每个“经理”创建一个范围。但是,当创建新经理(或分配给项目)时,范围似乎不会更新,但如果我重新启动服务器,它们会更新。所以代码本身“有效”,但显然不是我想要的方式。我是 ruby​​/rails 新手,所以我不确定是否需要做一些事情以某种方式“刷新”范围。

仅供引用,我在带有 ActiveAdmin 的 Heroku Cedar 上使用 Rails 3.2

这是有问题的代码(有效但仅在服务器重新启动后引入新的管理器):


Manager.find_each do |m|
  scope m.first_name do |projects|
    projects.where(:manager_id => m.id)
  end
end

以及整个 Active Admin Project 模型:

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 中看起来更好,并且更用户友好,因为范围变成了漂亮的标签。

这有点 hack,但在适当的情况下它是一个可行的解决方案:

诀窍是在 Controller 索引操作的 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

关于ruby-on-rails - 相关模型的每个实例的事件管理范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10450905/

相关文章:

ruby-on-rails - vim 和 Ruby on Rails

ruby-on-rails - 在 Rails 中使用 rescue

ruby-on-rails - AuthLogic perishable_token 在每次请求时重置

ruby-on-rails - 命名空间模块和 Rails 3.1.3 autoload_path

ruby-on-rails - 在 Rails 应用程序上设计、CanCan 和 ActiveAdmin

ruby-on-rails - PostgreSQL Ruby Heroku 问题

ruby-on-rails - Heroku 地理定位 >> 始终返回 "Seattle, WA"

ruby-on-rails - 电子邮件通知不是从 God gem 发送的

ruby - 在 ruby​​ 中运行系统命令并与之交互

ruby - 设置 Heroku 调试轨道运行器