Active Admin scopes for each instance of a related model Active Admin scopes for each instance of a related model heroku heroku

Active Admin scopes for each instance of a related model


Here is an actual solution to this problem ... Altho using filters instead is more desirable stability and maintenance wise, this looks nicer in ActiveAdmin and is more user friendly since scopes become nice looking tabs.

It is a bit of a hack, but it is a viable solution where appropriate:

The trick is to update the scopes in a before_filter on the controllers index action.

This could get bad if you have many scopes created on a resource (altho you can easily set some limits)

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  endend


I found this to work for me:

ActiveAdmin file

scope :working, :default => true do |projects|  Project.workingend

Model

scope :working, -> { where(:status => 'working') }

A bit late in the reply but hopefully it helps someone out.


True dynamic scopes inside the AA register blocks won't work. With that I mean that changes in the Manager table won't be reflected in the at 'initialization'-time created dynamic scopes. Also see: https://github.com/gregbell/active_admin/wiki/Creating-dynamic-scopes. What you could try is using filters instead of scopes. Then you can write something like:

filter :managers, :as => :select, :collection => proc { Manager.order('name ASC').map(&:first_name) }  

and changes in the managers properties will show (after page refresh) without restarting the server. Also check https://github.com/gregbell/active_admin/issues/1261#issuecomment-5296549

Also note that active record scopes are !different! from active admin scopes. you might want to check

http://apidock.com/rails/ActiveRecord/NamedScope/ClassMethods/scope