2009-01-06 15 views
17

मैं जानना चाहता हूं कि रेल माइग्रेशन में डेटाबेस तालिका में रिकॉर्ड जोड़ने का पसंदीदा तरीका कौन सा है। मैं ओला बिनी की पुस्तक (ऑन रेल्स JRuby) है कि वह कुछ इस तरह करता है पर पढ़ा है:माइग्रेशन पर पंक्तियां जोड़ें

class CreateProductCategories < ActiveRecord::Migration 

    #defines the AR class 
    class ProductType < ActiveRecord::Base; end 

    def self.up 

    #CREATE THE TABLES... 

    load_data 
    end 
    def self.load_data 
    #Use AR object to create default data 
    ProductType.create(:name => "type") 
    end 
end 

यह अच्छे और साफ है, लेकिन किसी कारण से, रेल के संस्करणों तक रहता है पर काम नहीं करता ...

सवाल यह है कि, आप डिफ़ॉल्ट डेटा (जैसे उपयोगकर्ता या कुछ) के साथ डेटाबेस कैसे पॉप्युलेट करते हैं?

धन्यवाद!

+0

काफी मैं क्या कर रहा है यही कारण है, आपको जो समस्या आ रहे हैं शामिल करें। –

+0

पूर्ण कोड यह है: http://pastie.org/pastes/251539 और त्रुटि 'CreateProductCategories निरंतर उत्पाद प्रकार गायब नहीं है' –

+0

इसके लिए seed.rb का उपयोग करें। – ironic

उत्तर

9

आप इसके लिए फिक्स्चर का उपयोग कर सकते हैं। इसका मतलब है कि उस डेटा के साथ कहीं भी यमल फ़ाइल रखना है जिसे आप सम्मिलित करना चाहते हैं।

db/migrate/004_load_profiles.rb

require 'active_record/fixtures' 

class LoadProfiles < ActiveRecord::Migration 
    def self.up 
    down() 

    directory = File.join(File.dirname(__FILE__), "init_data") 
    Fixtures.create_fixtures(directory, "profiles") 
    end 

    def self.down 
    Profile.delete_all 
    end 
end 

db/migrate/init_data/profiles.yaml

admin: 
name: Admin 
    value: 1 
normal: 
name: Normal user 
    value: 2 
3

आपके माइग्रेशन के पास आपके सभी मॉडल तक पहुंच है, इसलिए आपको माइग्रेशन के अंदर कक्षा नहीं बनाना चाहिए।

मैं नवीनतम रेल का उपयोग कर रहा हूं, और मैं पुष्टि कर सकता हूं कि आपके द्वारा पोस्ट किए गए उदाहरण को निश्चित रूप से काम करने के लिए तैयार किया गया है।

हालांकि, माइग्रेशन एक विशेष जानवर हैं। जब तक आप स्पष्ट हों, मुझे ActiveRecord::Base.connection.execute("INSERT INTO product_types (name) VALUES ('type1'), ('type2')") के साथ कुछ भी गलत नहीं दिख रहा है।

इसका लाभ यह है कि आप आसानी से इसे अपने शुरुआती डेटा को पॉप्युलेट करने के लिए किसी प्रकार के जीयूआई या वेब फ्रंट एंड का उपयोग कर उत्पन्न कर सकते हैं और फिर mysqldump -uroot database_name.product_types कर सकते हैं।

जो कुछ भी आपके प्रवास को निष्पादित करने और उत्पाद को बनाए रखने के लिए चीजों को आसान बनाता है।

35

माइग्रेशन के लिए रेल API दस्तावेज़ प्राप्त करने के लिए एक सरल तरीका पता चलता है:

यहाँ एक changeset मैं अपने ऐप में से एक में इस बात के लिए प्रतिबद्ध है इस।

http://api.rubyonrails.org/classes/ActiveRecord/Migration.html

class CreateProductCategories < ActiveRecord::Migration 
    def self.up 
    create_table "product_categories" do |t| 
     t.string name 
     # etc. 
    end 

    # Now populate the category list with default data 

    ProductCategory.create :name => 'Books', ... 
    ProductCategory.create :name => 'Games', ... # Etc. 

    # The "down" method takes care of the data because it 
    # drops the whole table. 

    end 

    def self.down 
    drop_table "product_categories" 
    end 
end 

ऑन रेल्स 2.3.0 परीक्षण किया गया है, लेकिन इस में कई पुराने संस्करणों के लिए भी काम करना चाहिए।

+1

यह अभी भी रिकॉर्ड के लिए रेल 3.0.3 के रूप में काम करता है। – coreyward

+0

जानना अच्छा है, धन्यवाद। –

+0

अनुशंसित तरीका बीज.आरबी का उपयोग करना है। – ironic

7

आप अपने seeds.rb फ़ाइल में निर्धारित कर सकते हैं, उदाहरण के लिए:

Grid.create :ref_code => 'one' , :name => 'Grade Única' 

और चलाने के बाद:

rake db:seed 
0

आप वास्तव में

ProductType.create 

उपयोग नहीं करना चाहिए अपने माइग्रेशन।

मैंने समान किया है लेकिन लंबे समय तक उन्हें काम करने की गारंटी नहीं है।

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

आप बहुत से बेहतर कर रहे हैं, उदाहरण के लिए एसक्यूएल चल:

[{name: 'Type', ..}, .. ].each do |type| 
    execute("INSERT INTO product_types (name) VALUES ('#{type[:name]} ..) 
end 
संबंधित मुद्दे