2011-08-08 22 views
13

डेटाबेस में प्रारंभिक डेटा लोड करने के लिए मैं बीज.आरबी के बजाय वाईएएमएल फ़ाइल का उपयोग कैसे करूं?रेल पर रूबी: वाईएएमएल फ़ाइल से बीज डेटा लोड करना

+0

देखकर के रूप में स्वीकार जवाब महान नहीं है ('परीक्षा /' निर्देशिका में बीज डेटा डालता है), और [मेरा उत्तर] (http://stackoverflow.com/a/24957205/405550) में काफी अधिक वृद्धि हुई है, क्या आप कृपया मेरा स्वीकार करने पर विचार करेंगे? – Zaz

उत्तर

3

बाहर चेक जुड़नार के लिए रेल गाइड पर रूबी:

http://guides.rubyonrails.org/testing.html#the-low-down-on-fixtures

आमतौर पर, आप test/ निर्देशिका में YAML स्थिरता फ़ाइलों को बनाने और फिर उन्हें rake db:fixtures:load आदेश का उपयोग कर अपने डेटाबेस में लोड कर सकते हैं। सभी चीज़ें हैं जो आप जुड़नार के साथ कर सकते पर पूर्ण प्रलेखन यहाँ है:

http://api.rubyonrails.org/classes/Fixtures.html

+3

क्या वही बात विकास या उत्पादन के लिए काम करेगी? – fijiaaron

+1

अंतिम लिंक टूटा हुआ है। साथ ही, 'test /' से बीज डेटा लोड करना चीजों को करने का सही तरीका नहीं लगता है। – Zaz

+0

यह मुझे असहज महसूस करता है, लेकिन व्यवहार में कुछ लोग परीक्षण उद्देश्यों के लिए डेटा को पॉप्युलेट करने के लिए फिक्स्चर का उपयोग करते हैं। दो जगहों पर एक ही yaml बीजिंग फाइलों को और भी अधिक महसूस होता है ... icky। – jaydel

19

db/seeds.rb में कोड जोड़ें YAML फ़ाइल पार्स करने के लिए, जैसे:

seed_file = Rails.root.join('db', 'seeds', 'categories.yml') 
config = YAML::load_file(seed_file) 
Category.create!(config) 

फिर, बस YAML जगह db/seeds/categories.yml में फाई। वाईएएमएल फ़ाइल सहयोगी सरणी की एक सूची होनी चाहिए, उदाहरण:

- name: accessory 
    shortcode: A 

- name: laptop 
    shortcode: L 

- name: server 
    shortcode: S 
+0

इस समाधान के साथ समस्या यह है कि यदि आप 'रेक डीबी: बीज' एक सेकेंड चलाते हैं समय, आपको डुप्लिकेट का एक गुच्छा मिलेगा। विशिष्टता के लिए आवश्यकताओं के आधार पर, आप शायद आखिरी पंक्ति को कुछ ऐसा करने के लिए संशोधित करना चाहेंगे जैसे: config.each {| values ​​| Category.first_or_create (मान)} ' – sberkley

+0

आप किस स्थिति में डेटाबेस को दो बार बीज करना चाहते हैं? 'रेक डीबी: रीसेट' आपको 99% समय की आवश्यकता है। – Zaz

+2

यदि आप तालिका में नए बीज वाले मान जोड़ते हैं या बीजित मानों के साथ एक नई तालिका जोड़ते हैं। पूरे डेटाबेस को छोड़ना विकास वातावरण में एक समाधान हो सकता है, लेकिन निश्चित रूप से उत्पादन में नहीं है। पुन: बीजिंग से पहले बीज की मेज को छोड़ना भी एक विकल्प नहीं है यदि किसी तालिका में उस तालिका के आईडी के संदर्भ हैं। यदि आपको पहले बीजित मूल्यों को हटाने की आवश्यकता है तो स्थिति और भी जटिल हो जाती है और 'रेक डीबी: बीज' से परे समाधान की आवश्यकता हो सकती है। – sberkley

2

मैंने उत्तर @Zaz का उत्तर दिया। ये अच्छी तरह काम करता है।

लेकिन इस बीच यदि आपके बीज डेटा में कुछ गड़बड़ हुई (उदाहरण के लिए आपके पास बहुत बड़ी बीज यामल फ़ाइल है), तो आप जानना चाहेंगे कि आपके यम का कौन सा हिस्सा गलत हो गया था। उस समय आप बनाने के बाद एक ब्लॉक जोड़ सकते हैं! इस तरह डिबग के लिए:

seed_file = Rails.root.join('db', 'seeds', 'categories.yml') 
config = YAML::load_file(seed_file) 
counter = 0 
Category.create!(config) do |c| 
    puts "Create category #{counter += 1} with name: #{c.name}" 
end 
संबंधित मुद्दे