2012-05-04 14 views
8

मुझे गतिशील सक्रिय व्यवस्थापक स्कोप के साथ कोई समस्या है। मैं अपने ऐप में "प्रोजेक्ट" के प्रत्येक "प्रबंधक" के लिए एक दायरा बनाने का प्रयास कर रहा हूं। हालांकि, जब कोई नया प्रबंधक बनाया जाता है (या किसी प्रोजेक्ट को असाइन किया जाता है) तो स्कॉप्स अपडेट नहीं होते हैं, लेकिन अगर मैं सर्वर को पुनरारंभ करता हूं तो वे अद्यतन करते हैं। तो कोड प्रति "काम करता है" लेकिन स्पष्ट रूप से जिस तरह से मैं इसे पसंद नहीं करता हूं। मैं एक रूबी/रेल नोब हूं इसलिए मुझे यकीन नहीं है कि मुझे कुछ तरीकों से "रीफ्रेश" करने के लिए कुछ करने की ज़रूरत है।संबंधित मॉडल के प्रत्येक उदाहरण के लिए सक्रिय व्यवस्थापक स्कोप

एक के रूप में FYI करें, मैं रेल 3.2 का उपयोग कर रहा Heroku देवदार पर ActiveAdmin

यहाँ के साथ सवाल में कोड (कि लेकिन काम करता है केवल नए प्रबंधकों में लाता है के बाद सर्वर पुनरारंभ) है:


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

और पूरे सक्रिय व्यवस्थापक परियोजना मॉडल:

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

अगले जवाब महान है। मुझे समझ में नहीं आया कि आपने इसे उत्तर के रूप में क्यों चिह्नित नहीं किया। –

उत्तर

1

रेल केवल कक्षाओं पर लोड हो जाता है उत्पादन मोड में सीई। इसका मतलब है कि आपके स्कॉप्स को केवल एक बार बुलाया जा रहा है और फिर उन्हें कैश किया जाता है। यही कारण है कि नए स्कोप फिर से शुरू होने तक दिखाई नहीं देते हैं। यदि आप अपने मामले में प्रबंधक का पहला नाम संपादित करते हैं तो वही बात सच होगी।

मुझे लगता है कि समाधान लैम्ब्डा या प्रो का उपयोग करने के लिए हो सकता है, लेकिन कुछ मिनटों में मैंने इसके साथ खेला, मैं सफल नहीं था। यह संभव नहीं हो सकता है कि सक्रियडमिन भी लिखा गया हो।

+0

यह सही है कि यह संभव नहीं है। जिस तरह से सक्रियडमिन ने सक्रिय रिकॉर्ड स्कोप विधि के आसपास अपने दायरे रैपर को कार्यान्वित किया है, इस पर प्रतिबंध लगाता है। हुक को बचाने/प्रतिबद्ध करने के बाद शायद "reload_scope" विधि को सक्रियकॉर्ड के संपर्क में लाया जा सकता है। क्या आपको ऐसा करने का कोई विचार है? –

2

एए रजिस्टर ब्लॉक के अंदर सही गतिशील स्कोप काम नहीं करेंगे। इसके साथ मेरा मतलब है कि प्रबंधक तालिका में परिवर्तन 'प्रारंभिक' समय-समय पर गतिशील स्कॉप्स में दिखाई नहीं देंगे। यह भी देखें: https://github.com/gregbell/active_admin/wiki/Creating-dynamic-scopes। आप जो कोशिश कर सकते हैं वह स्कॉप्स के बजाय फ़िल्टर का उपयोग कर रहा है। फिर आप कुछ लिख सकते हैं जैसे:

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

और प्रबंधक गुणों में परिवर्तन सर्वर को पुनरारंभ किए बिना (पेज रीफ्रेश के बाद) दिखाएगा। https://github.com/gregbell/active_admin/issues/1261#issuecomment-5296549

यह भी ध्यान दें कि सक्रिय रिकॉर्ड स्कॉप्स हैं! अलग! सक्रिय व्यवस्थापक scopes से। आप

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

+1

धन्यवाद! एक proc में संग्रह को Encapsulating सही है ताकि यह मांग पर चल रहा है। यह 'रेक डीबी: स्कीमा: लोड' और' रेक डीबी: माइग्रेट 'मुद्दों को भी हल करता है। ActiveAdmin फ़िल्टर किसी योजना में संलग्न नहीं होने पर इसे बनाए जाने से पहले स्कीमा तक पहुंचने का प्रयास करेंगे। – scarver2

3

मैं इस पाया मेरे लिए काम करने के लिए जाँच करने के लिए चाहते हो सकता है:

ActiveAdmin फ़ाइल

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

मॉडल

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

थोड़ा उत्तर में देर से लेकिन उम्मीद है कि यह किसी की मदद करता है।

+2

क्या यह वास्तव में कई स्कोप बनाने के लिए काम करता है? मैं देख सकता हूं कि एक गुंजाइश बनाई गई है .. – James

10

यहां इस समस्या का एक वास्तविक समाधान है ... इसके बजाय फिल्टर का उपयोग करने वाले अल्थो अधिक वांछनीय स्थिरता और रखरखाव के अनुसार है, यह 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 
+0

कुछ सिफारिशें करने के लिए जिथब पर डेक्सटर के लिए धन्यवाद: [एसोसिएटेड गिटहब इश्यू] (https://github.com/gregbell/active_admin/issues/1261#issuecomment-22207740) –

+0

कैसे जब वे हटा दिए जाते हैं? –

+1

मैं इसका परीक्षण करने के लिए सेटअप नहीं कर रहा हूं, लेकिन मैंने अभी कुछ कोड जोड़ा है जो हटाने में मदद करनी चाहिए। –