2010-07-14 21 views
11

रेल मांग पर मॉडल लोडिंग करता है। एक रेक कार्य के लिए जो मैं लिख रहा हूं, मुझे सभी ActiveRecord::Base उदाहरणों पर पुन: सक्रिय करने में सक्षम होना चाहिए (जो ActiveRecord::Base.send(:subclasses) के साथ संभव है)।मैं सभी मॉडलों को लोड करने के लिए रेल को कैसे मजबूर कर सकता हूं?

हालांकि, उपर्युक्त काम करने के लिए, उन्हें पहले ही लोड किया जाना है। किसी को भी सभी मॉडलों को लोड करने के लिए मजबूर करने के तरीके के बारे में पता है? आदर्श रूप से मैं app/models के माध्यम से पोक करना नहीं चाहता क्योंकि मैं प्लगइन द्वारा जोड़े गए मॉडल को भी पकड़ना चाहता हूं।

उत्तर

12

रेल 2:

Dir[Pathname(RAILS_ROOT) + 'app/models/**/*.rb'].each do |path| 
    require path 
end 

रेल 3:

Dir[Rails.root + 'app/models/**/*.rb'].each do |path| 
    require path 
end 

एक और तरीका:

(ActiveRecord::Base.connection.tables - %w[schema_migrations]).each do |table| 
    table.classify.constantize rescue nil 
end 
+1

समस्या के अनुसार समस्या यह है कि प्लगइन द्वारा जोड़े गए मॉडल को नहीं पकड़ेगा। ठोस शब्दों में, जो प्लगइन मैं लिख रहा हूं उसके लिए महत्वपूर्ण मामलों में से एक एक स्प्री शॉप है, जहां मूल रूप से मॉडल में से कोई भी मॉडल 'ऐप/मॉडल' – scotchi

+0

में नहीं है, बस ग्लोब => 'Dir' की शुरुआत में '** /' जोड़ें [Rails.root + '**/ऐप/मॉडल/**/* आरबी'] ' – tig

+0

हालांकि, आपको सभी मॉडलों के माध्यम से क्यों जाना है? – tig

26

मैं जरूरत सभी मॉडलों के एक रेक काम है कि सभी रिकॉर्ड की वैधता की जाँच करता है के लिए लोड , और आसान विधि eager_load मिली, जिसका उपयोग इस तरह किया जा सकता है:

Rails.application.eager_load!

+5

मैं वास्तव में दूसरों को यह जवाब पसंद करता हूं। यह मेरी राय में चीजों को करने का एक बहुत साफ तरीका है। – taelor

संबंधित मुद्दे

 संबंधित मुद्दे