Rails में डेटाबेस को बीज करने का सबसे अच्छा तरीका क्या है?


82

मेरे पास एक रेक कार्य है जो मेरे रेल एप्लिकेशन में कुछ प्रारंभिक डेटा को पॉप्युलेट करता है। उदाहरण के लिए, देश, राज्य, मोबाइल वाहक, आदि।

जिस तरह से मैंने इसे अभी स्थापित किया है, क्या मेरे पास फाइलों में / db / जुड़नार में बयान बनाने और उन्हें संसाधित करने वाले एक रेक कार्य का एक गुच्छा है। उदाहरण के लिए, मेरे पास एक मॉडल थीम है। मेरे पास एक ऐसी थीम है। फ़ाइल / db / जुड़नार जो इस तरह दिखती है:

Theme.delete_all
Theme.create(:id => 1, :name=>'Lite', :background_color=>'0xC7FFD5', :title_text_color=>'0x222222',
                      :component_theme_color=>'0x001277', :carrier_select_color=>'0x7683FF', :label_text_color=>'0x000000',
                      :join_upper_gradient=>'0x6FAEFF', :join_lower_gradient=>'0x000000', :join_text_color=>'0xFFFFFF',
                      :cancel_link_color=>'0x001277', :border_color=>'0x888888', :carrier_text_color=>'0x000000', :public => true)

Theme.create(:id => 2, :name=>'Metallic', :background_color=>'0x000000', :title_text_color=>'0x7299FF',
                      :component_theme_color=>'0xDBF2FF', :carrier_select_color=>'0x000000', :label_text_color=>'0xDBF2FF',
                      :join_upper_gradient=>'0x2B25FF', :join_lower_gradient=>'0xBEFFAC', :join_text_color=>'0x000000',
                      :cancel_link_color=>'0xFF7C12', :border_color=>'0x000000', :carrier_text_color=>'0x000000', :public => true)

Theme.create(:id => 3, :name=>'Blues', :background_color=>'0x0060EC', :title_text_color=>'0x000374',
                      :component_theme_color=>'0x000374', :carrier_select_color=>'0x4357FF', :label_text_color=>'0x000000',
                      :join_upper_gradient=>'0x4357FF', :join_lower_gradient=>'0xffffff', :join_text_color=>'0x000000',
                      :cancel_link_color=>'0xffffff', :border_color=>'0x666666', :carrier_text_color=>'0x000000', :public => true)
puts "Success: Theme data loaded"

यहां विचार यह है कि मैं उपयोगकर्ताओं को शुरू करने के लिए कुछ स्टॉक थीम स्थापित करना चाहता हूं। मुझे इस विधि से समस्या है।

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

मेरा सवाल सबसे पहले यह है कि क्या डेटाबेस को सीडिंग करने का यह एक अच्छा तरीका है? एक पिछली पोस्ट में, यह मेरे लिए सिफारिश की गई थी।

यदि हां, तो मैं आईडी को हार्ड कोड कैसे दे सकता हूं, और क्या इसमें कोई डाउनसाइड है?

यदि नहीं, तो डेटाबेस को बीज करने का सबसे अच्छा तरीका क्या है?

मैं वास्तव में लंबे और सोचे हुए उत्तरों की सराहना करूंगा जो सर्वोत्तम प्रथाओं को शामिल करते हैं।

जवाबों:


113

इन उत्तरों के बाद से अपडेट करना थोड़ा पुराना है (हालाँकि कुछ अभी भी लागू हैं)।

रेल में साधारण सुविधा 2.3.4, db / seeds.rb को जोड़ा गया

एक नया रेक कार्य प्रदान करता है

rake db:seed

राज्यों, देशों, आदि जैसे सामान्य स्थैतिक रिकॉर्ड को आबाद करने के लिए अच्छा है ...

http://railscasts.com/episodes/179-seed-data

* ध्यान दें कि आप जुड़नार का उपयोग कर सकते हैं यदि आपने उन्हें पहले से ही डीबी के साथ पॉप्युलेट करने के लिए बनाया था: बीज को अपने सीड्रेसबीआर फाइल में (रैलकास्ट एपिसोड से) डालकर:

require 'active_record/fixtures'
Fixtures.create_fixtures("#{Rails.root}/test/fixtures", "operating_systems")

रेल के लिए 3.x 'फिक्स्चर' स्थिरांक के बजाय 'ActiveRecord :: जुड़नार' का उपयोग करें

require 'active_record/fixtures'
ActiveRecord::Fixtures.create_fixtures("#{Rails.root}/test/fixtures", "fixtures_file_name")

28

आमतौर पर 2 प्रकार के बीज डेटा की आवश्यकता होती है।

  • मूल डेटा जिस पर आपके एप्लिकेशन का मूल भरोसा हो सकता है। मैं इसे सामान्य बीज कहता हूं।
  • पर्यावरण डेटा , उदाहरण के लिए ऐप को विकसित करने के लिए एक ज्ञात राज्य में डेटा का एक गुच्छा होना उपयोगी है जिसे हम स्थानीय रूप से ऐप पर काम करने के लिए उपयोग कर सकते हैं (ऊपर फैक्ट्री गर्ल का उत्तर इस तरह के डेटा को कवर करता है)।

अपने अनुभव में मैं हमेशा इन दो प्रकार के डेटा की आवश्यकता के लिए आ रहा था। इसलिए मैंने एक छोटा सा रत्न एक साथ रखा जो रेल के बीजों को फैलाता है और आपको db / बीज / और किसी भी पर्यावरणीय बीज डेटा को db / बीज / ENV के तहत जोड़ने की सुविधा देता है, उदाहरण के लिए db / बीज / विकास।

मैंने पाया है कि यह दृष्टिकोण मेरे बीज डेटा को कुछ संरचना देने के लिए पर्याप्त है और मुझे केवल चलाने के द्वारा एक ज्ञात स्थिति में अपने विकास या मंचन के माहौल को स्थापित करने की शक्ति देता है:

rake db:setup

नियमित एसक्यूएल डंप के रूप में जुड़नार नाजुक और परतदार हैं।


मुझे उन चीजों का वर्णन करने के लिए "सिस्टम डेटा" और "रनटाइम डेटा" पसंद हैं, जो कोड उपयोगकर्ताओं के मौजूदा बनाम डेटा पर निर्भर करता है। कभी-कभी उनके बीच की रेखा धुंधली होती है।
टिम एबेल

27

factory_bot लगता है कि यह वही करेगा जो आप प्राप्त करने की कोशिश कर रहे हैं। आप डिफ़ॉल्ट परिभाषा में सभी सामान्य विशेषताओं को परिभाषित कर सकते हैं और फिर निर्माण के समय उन्हें ओवरराइड कर सकते हैं। आप कारखाने में एक आईडी भी दे सकते हैं:

Factory.define :theme do |t|
  t.background_color '0x000000'
  t.title_text_color '0x000000',
  t.component_theme_color '0x000000'
  t.carrier_select_color '0x000000'
  t.label_text_color '0x000000',
  t.join_upper_gradient '0x000000'
  t.join_lower_gradient '0x000000'
  t.join_text_color '0x000000',
  t.cancel_link_color '0x000000'
  t.border_color '0x000000'
  t.carrier_text_color '0x000000'
  t.public true
end

Factory(:theme, :id => 1, :name => "Lite", :background_color => '0xC7FFD5')
Factory(:theme, :id => 2, :name => "Metallic", :background_color => '0xC7FFD5')
Factory(:theme, :id => 3, :name => "Blues", :background_color => '0x0060EC')

जब फ़ेकर के साथ उपयोग किया जाता है, तो यह फ़िक्चर्स (यक) के साथ गड़बड़ करने के बिना संघों के साथ वास्तव में जल्दी से एक डेटाबेस को आबाद कर सकता है।

मेरे पास एक रेक कार्य में इस तरह का कोड है।

100.times do
    Factory(:company, :address => Factory(:address), :employees => [Factory(:employee)])
end

11
FactoryGirl वास्तव में जुड़नार के बदले में परीक्षण के लिए है, लेकिन इसका उपयोग सामान को उत्पादन में लोड करने के लिए भी किया जा सकता है। एक रेक कार्य का उपयोग करें जिसमें db है: सभी डिफ़ॉल्ट डेटा को लोड करने के लिए एक शर्त के रूप में माइग्रेट करें। आपको रेक कार्य को पर्याप्त रूप से बुद्धिमान बनाने की आवश्यकता हो सकती है जो मौजूदा डेटा की प्रतियां नहीं बनाता है।
बॉब अमन

2
बीज के लिए FactoryGirl का उपयोग करने की अनुशंसा नहीं की जाती है, इस पोस्ट की जांच करें
ब्लैकबिरॉन

26

seeds.rbफ़ाइल का उपयोग करना या FactoryBotमहान है, लेकिन ये निश्चित डेटा संरचनाओं और परीक्षण के लिए क्रमशः महान हैं।

seedbankमणि आप अपने बीज के लिए और अधिक नियंत्रण और प्रतिरूपकता दे सकता है। यह रेक कार्यों को सम्मिलित करता है और आप अपने बीजों के बीच निर्भरता को भी परिभाषित कर सकते हैं। आपकी रेक कार्य सूची में ये अतिरिक्त होंगे (जैसे):

rake db:seed                    # Load the seed data from db/seeds.rb, db/seeds/*.seeds.rb and db/seeds/ENVIRONMENT/*.seeds.rb. ENVIRONMENT is the current environment in Rails.env.
rake db:seed:bar                # Load the seed data from db/seeds/bar.seeds.rb
rake db:seed:common             # Load the seed data from db/seeds.rb and db/seeds/*.seeds.rb.
rake db:seed:development        # Load the seed data from db/seeds.rb, db/seeds/*.seeds.rb and db/seeds/development/*.seeds.rb.
rake db:seed:development:users  # Load the seed data from db/seeds/development/users.seeds.rb
rake db:seed:foo                # Load the seed data from db/seeds/foo.seeds.rb
rake db:seed:original           # Load the seed data from db/seeds.rb

1

जैसा कि यहाँ बताया गया है, रेल डेटा के लिए एक अंतर्निहित तरीका है

एक और तरीका यह होगा कि आप अधिक उन्नत या आसान बीजारोपण के लिए एक मणि का उपयोग करें: सीडबैंक

इस मणि का मुख्य लाभ और इसका उपयोग करने का कारण यह है कि इसमें उन्नत क्षमता है जैसे डेटा लोडिंग निर्भरता और प्रति पर्यावरण बीज डेटा।

अप-टू-डेट उत्तर जोड़ना क्योंकि यह उत्तर पहले Google पर था।


-3

सबसे अच्छा तरीका जुड़नार का उपयोग करना है।

नोट: ध्यान रखें कि जुड़नार सीधे आवेषण करते हैं और अपने मॉडल का उपयोग न करें यदि आपके पास कॉलबैक हैं जो डेटा को आबाद करते हैं तो आपको वर्कअराउंड खोजने की आवश्यकता होगी।


-4

इसे डेटाबेस माइग्रेशन में जोड़ें, जिस तरह से सभी को यह अपडेट मिलता है। रूबी / रेल कोड में अपने सभी तर्क संभालें, ताकि आपको स्पष्ट आईडी सेटिंग्स के साथ गड़बड़ न करना पड़े।


यदि मुझे प्रारंभिक डेटा को बदलने की आवश्यकता है, तो माइग्रेशन का उपयोग करते समय चीजें गड़बड़ हो सकती हैं। आपकी दूसरी टिप्पणी का वास्तव में कोई मतलब नहीं है। विदेशी कुंजी के माध्यम से लिंक नष्ट हो जाएंगे
टोनी

c = Category.create (सामान) p = Post.create (सामान) p.category = c कोई ज़रूरत नहीं है पहचान आईडी। यदि आप प्रारंभिक डेटा बदलते हैं, तो आप एक नया माइग्रेशन बनाते हैं। बहुत आसान।
मैट रोजिश

यह मानते हुए कि जिस समय वस्तु बनाई जाती है, उस समय संघ बनाया जा सकता है। यहाँ एक उदाहरण है जहाँ मेरा मानना ​​है कि आपका तर्क विफल हो जाता है ... अगर मैं गलत हूँ तो मुझे सुधारें। मैं टेम्पलेट विषयों के साथ DB बीज। user id = 1 टेम्पलेट id = 2 बनाता है और थीम id = 4 के साथ। इस बिंदु पर, एक रिकॉर्ड db में निम्नानुसार है: टेम्पलेट: id = 2, user_id = 1, theme_id = 4। अब अगर मैं db, थीम id = 4 को फिर से लिखता हूं, तो अब थीम id = 10 है ... और फिर उपयोगकर्ता का टेम्पलेट गलत थीम पर है
टोनी

ठीक है, यह इस बात पर निर्भर करता है कि "री-इनिट" से आपका क्या मतलब है - यदि आप शून्य से शुरू करते हैं, तो रेल स्वचालित रूप से सभी संघों को संभालती है। यदि आप आईडी मान (खराब !!!) को हार्ड कोडिंग कर रहे हैं, तो हाँ यह उड़ जाएगा।
मैट रॉजिश

ठीक है, मैं आपकी बात देखना शुरू कर रहा हूं, लेकिन मुझे यह परिदृश्य आपके द्वारा चलाना होगा। मैं एक देश तालिका के साथ डेटाबेस बीज। यूएसए => देश आईडी = 1। फिर एक उपयोगकर्ता एक रेस्तरां बनाता है जो संयुक्त राज्य अमेरिका में मौजूद है। रेस्तरां डेटाबेस पंक्ति में country_id = 1. यह बहुत सामान्य है, है ना? मैं बाद में फैसला करता हूं कि मैं और अधिक देशों को जोड़ना चाहता हूं ... अगर मैं डीबी को साफ कर दूंगा और देश के लुकअप टेबल को फिर से खोल दूंगा, तो अब रेस्तरां देश अब सटीक नहीं है जब तक कि आईडी समान नहीं है। इससे मैं कैसे निपटूं?
टोनी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.