2012-05-04 8 views
8

Ho un problema con un ambito di amministrazione dinamico attivo. Sto tentando di creare uno scope per ogni "manager" di un "progetto" nella mia app. Tuttavia, gli ambiti non sembrano aggiornare quando viene creato un nuovo gestore (o assegnato a un progetto), ma vengono aggiornati se riavvio il server. Quindi il codice "funziona" di per sé ma ovviamente non nel modo in cui mi piacerebbe farlo. Sono un rubino/rail noob quindi non sono sicuro di dover fare qualcosa per "rinfrescare" l'oscilloscopio in qualche modo.Ambiti di amministrazione attivi per ogni istanza di un modello correlato

Come FYI, sto usando Rails 3.2 su Heroku cedro con ActiveAdmin

Ecco il codice in questione (che funziona, ma porta solo a nuovi manager dopo il riavvio del server):


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

E l'intero attivo il modello di amministrazione del progetto:

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 
+0

La risposta successiva è grande. Non capisco perché non l'hai contrassegnato come risposta. –

risposta

1

Rails carichi solo lezioni su ce in modalità produzione. Ciò significa che i tuoi ambiti vengono richiamati una sola volta e quindi vengono memorizzati nella cache. Questo è il motivo per cui i nuovi ambiti non vengono visualizzati fino a dopo il riavvio. La stessa cosa sarebbe vera se hai modificato il nome del manager nel tuo caso.

Penso che la soluzione potrebbe essere utilizzare un lambda o Proc, ma nei pochi minuti in cui ho giocato con esso, non ho avuto successo. Potrebbe non essere possibile il modo in cui è scritto anche activeadmin.

+0

È corretto che non sia possibile. Il modo in cui activeadmin ha implementato il wrapper dell'oscilloscopio attorno al metodo dell'ambito del record attivo lo vieta. Forse un metodo "reload_scope" potrebbe essere in qualche modo esposto a activerecord dopo aver salvato/commesso gli hook. Hai qualche idea su come farlo? –

2

I veri campi dinamici all'interno dei blocchi di registro AA non funzioneranno. Con questo voglio dire che le modifiche nella tabella Manager non si rifletteranno negli ambiti dinamici 'initialization'-time creati. Vedi anche: https://github.com/gregbell/active_admin/wiki/Creating-dynamic-scopes. Quello che potresti provare è usare i filtri invece degli ambiti. Poi si può scrivere qualcosa di simile:

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

e cambiamenti nelle proprietà manager mostrerà (dopo pagina refresh) senza riavviare il server. Controllare anche https://github.com/gregbell/active_admin/issues/1261#issuecomment-5296549

Si noti inoltre che gli ambiti di registrazione attivi sono! Diversi! dagli ambiti di amministrazione attivi. si potrebbe voler controllare

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

+1

Grazie! Incapsulare la raccolta in un proc è corretta in modo che venga eseguita su richiesta. Questo risolve anche i problemi di 'rake db: schema: load' e' rake db: migrate'. I filtri ActiveAdmin tenteranno di accedere allo schema prima che sia stato creato se non è stato incluso in un proc. – scarver2

3

Ho trovato questo a lavorare per me:

file di ActiveAdmin

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

Modello

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

Un po 'in ritardo nella risposta, ma speriamo che aiuti qualcuno.

+2

Questo ha davvero funzionato per creare più ambiti? Vedo che viene creato uno scope .. – James

10

Ecco una soluzione reale a questo problema ... Anche se l'utilizzo dei filtri è preferibile per la stabilità e la manutenzione, questo aspetto è più gradevole in ActiveAdmin ed è più intuitivo poiché gli ambiti diventano schede di aspetto piacevole.

è un po 'di un hack, ma è una soluzione praticabile, se del caso:

Il trucco è quello di aggiornamento gli ambiti in un before_filter sull'azione indice di controllori.

Questo potrebbe ottenere male se si dispone di molti ambiti creati su una risorsa (ma nemmeno si può facilmente impostare alcuni limiti)

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 
+0

Grazie a Daxter su github per aver fatto alcuni consigli: [Problema associato a GitHub] (https://github.com/gregbell/active_admin/issues/1261#issuecomment-22207740) –

+0

Come a proposito di quando vengono cancellati? –

+1

Non sono configurato per testarlo, ma ho appena aggiunto del codice che dovrebbe aiutare nelle eliminazioni. –

Problemi correlati