2010-02-26 15 views
11

मैं कुछ लुकअप टेबल डेटा को वाईएएमएल फ़ाइल में सहेजने की कोशिश कर रहा हूं ताकि बाद में जब मुझे एक अलग मशीन पर अपना ऐप सेट अप करने की आवश्यकता हो तो मैं डेटा को बीज डेटा के रूप में लोड कर सकता हूं।मैं कुछ ActiveRecord मॉडल को YAML फ़ाइल से कैसे लोड कर सकता हूं और उन्हें डीबी में सहेज सकता हूं?

डेटा चुनिंदा विकल्पों की तरह सामान है, और यह बहुत अधिक सेट है, इसलिए धारावाहिक और deserializing के बीच बदल रहे लाइव डेटा के बारे में कोई चिंता नहीं है।

मैं उत्पादन इस तरह डेटा है ...

file = File.open("#{RAILS_ROOT}/lib/tasks/questions/questions.yml", 'w') 
questions = Question.find(:all, :order => 'order_position') 
file << YAML::dump(questions) 
file.close() 

और मैं इस तरह फ़ाइल को लोड कर सकते हैं ...

questions = YAML.load_file('lib/tasks/questions/questions.yml') 

हालांकि, जब मैं एक सवाल मैं बचाने की कोशिश यह त्रुटि ...

>> questions[0].save 
NoMethodError: undefined method `save' for #<YAML::Object:0x2226b84> 

ऐसा करने का सही तरीका क्या है?

+0

रेल का आप किस संस्करण का उपयोग कर रहे हैं? –

+0

मैं रेल का उपयोग कर रहा हूँ 2.3.5 – Ethan

उत्तर

8

लोड करने के लिए मैं अपने परिदृश्य की कोशिश की और मैं किसी भी मुद्दे नहीं था।

yml_file = Rails.root.join('lib', 'tasks', 'questions', 'questions.yml') 
question_attributes_list = YAML.load_file(yml_file).map(&:attributes) 
questions = Question.create(question_attributes_list) 
1

यदि आप रेल 2.3.4 (या ऊपर) का उपयोग कर रहे हैं, तो उनके पास seeds.rb फ़ाइल है जो आपके अनुप्रयोग db फ़ोल्डर में पाई जा सकती है।

rake db:seed 

इसमें here पर एक उत्कृष्ट Railscast है, और यह here के बारे में एक अच्छा ब्लॉग पोस्ट: यह आपको बुनियादी सक्रिय रिकॉर्ड बनाता है परिभाषित करते हैं, और जब आप अपने नए परियोजना की स्थापना के बाद, आप कॉल कर सकते हैं कर सकते हैं। यदि आप रेल 2.3.4 (या, आदर्श, 2.3.5) का उपयोग नहीं कर रहे हैं, तो मैं इन शांत सुविधाओं, और अतिरिक्त सुरक्षा/बग फिक्स के लिए अद्यतन करने की अत्यधिक अनुशंसा करता हूं।

+0

धन्यवाद, हाँ यह एक शानदार विशेषता है। मैं डेटा को वाईएएमएल फ़ाइल में स्टोर करना चाहता हूं और इसे 'seed.rb' का उपयोग करके लोड करना चाहता हूं। पर्याप्त डेटा है कि सीधे मॉडल 'बीडीआर' में मॉडल तत्काल को कोडिंग करना अजीब होगा। – Ethan

+0

बीज.आरबी सिर्फ एक रूबी फ़ाइल है। जैसा कि वर्णन किया गया है, आप बीज.आरबी के अंदर वाईएएमएल लोड कर सकते हैं (http://ruby-doc.org/core/classes/YAML.html), और मॉडल.क्रेट() के दौरान सरणी के माध्यम से बस लूप करें। –

20

निर्देशिका में seed.yml फ़ाइल बनाएं। आप जिस मॉडल को बनाना चाहते हैं उसके लिए एक वाईएएमएल दस्तावेज़ जोड़ें। इस दस्तावेज़ में हैश की एक सूची होनी चाहिए। प्रत्येक हैश में मॉडल विशेषताएँ होनी चाहिए।

users: 
     - login: jake 
      password: jake123 
      password_confirmation: jake123 
      first_name: Jake 
      last_name: Driver 

     - login: Jane 
      password: jane123 
      password_confirmation: jane123 
      first_name: Jane 
      last_name: McCain 

    categories: 

    products: 

अपने seed.rb फ़ाइल

seed_file = File.join(Rails.root, 'db', 'seed.yml') 
config = YAML::load_file(seed_file) 
User.create(config["users"]) 
Category.create(config["categories"]) 
Product.create(config["products"]) 

भागो रेक कार्य पंक्तियों

rake db:seed 
+0

मैन, यह जानना बहुत उपयोगी है। धन्यवाद। क्या यह अभी भी रेल 4 में प्रासंगिक है? – Batman

+0

@ बैटमैन मुझे ऐसा लगता है। यह मानक वाईएएमएल पार्सर और एआर सरणी बनाने की विधि पर निर्भर करता है। –

10

स्वीकार किए जाते हैं जवाब वास्तव में इस सवाल का जवाब है:

yml_file = Rails.root.join('lib', 'tasks', 'questions', 'questions.yml') 
File.open(yml_file, 'w') do |file| 
    questions = Question.order(:order_position).to_a 
    YAML::dump(questions, file) 
end 

मैं इस प्रकार questions सूची प्राप्त करने में सक्षम था: मैं अपने YAML फ़ाइल सृजन तर्क में निम्न परिवर्तन किया था? ऐसा लगता है कि पूछताछ मॉडल को सहेजना चाहता था, न कि उन्हें केवल वाईएएमएल फ़ाइल से पुनर्प्राप्त करें।

वास्तव में को लोड किए गए मॉडल को वापस लोड करने के लिए आपको ActiveRecord को बेवकूफ बनाने की आवश्यकता है ताकि मॉडल को सहेजने की आवश्यकता हो। आप इसे कोड के बजाय गंदे बिट

questions = YAML.load_file("#{RAILS_ROOT}/lib/tasks/questions/questions.yml") 
questions.each{|q| q.instance_variable_set("@new_record", true); q.save} 

यह मेरे बेकन को एक या दो बार सहेजता है और सहेजता है।

+0

धन्यवाद, यह मुझे काम करने के लिए थोड़ा सा था। – Jurgen

+0

यह स्वीकार्य उत्तर होना चाहिए। धन्यवाद! – cschille

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

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