2009-01-06 25 views
17

Rails Migration'da bir veritabanı tablosuna kayıt eklemek için tercih edilen yolun hangisi olduğunu bilmek istiyorum. Onun böyle bir şey yapar Ola Bini kitabının (Ruby on jruby) üzerine okudum:Migrations Satırları Ekle

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 

Bu güzel ve temiz ama raylar sürümlerini sürer üzerinde nedense çalışmıyor ...

Sorun şu ki, veritabanını varsayılan verilerle (kullanıcılar veya bir şey gibi) nasıl doldurursunuz?

Teşekkürler!

+0

, aldığınız hatayı da ekleyin. –

+0

Tam kod şudur: http://pastie.org/pastes/251539 Ve hata 'CreateProductCategories sabit Ürün Türü eksik değil' –

+0

Bunun için seeds.rb kullanın. – ironic

cevap

9

Bunun için armatürleri kullanabilirsiniz. Eklemek istediğiniz verilere sahip bir yerde bir yaml dosyası olması anlamına gelir.

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

Taşınmalarınız tüm modellerinize erişebilir, bu nedenle geçişin içinde bir sınıf oluşturmamanız gerekir.

En son rayları kullanıyorum ve gönderim yaptığınız örneğin mutlaka OUGHT çalışmasını onaylayabilirim. Ancak, geçişler özel bir canavara sahiptir. Açık olduğunuz sürece, bir ActiveRecord::Base.connection.execute("INSERT INTO product_types (name) VALUES ('type1'), ('type2')") ile yanlış bir şey göremiyorum.

Bunun avantajı, başlangıç ​​verilerinizi doldurmak ve daha sonra mysqldump -uroot database_name.product_types yapmak için bir çeşit GUI veya web ön ucu kullanarak kolayca üretebilirsiniz.

Göçlerinizi yürütecek ve ürünü koruyacak kişi için işleri en kolay yapan şey her neyse.

35

taşıma işlemlerinde Raylar API belgeleri elde etmek için basit bir yol gösterir: Burada

Benim app birinde bu işlenen bir değişiklik kümesi ise bu.

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 

Raylar 2.3.0 üzerinde test edilmiştir ancak bu çok önceki sürümleri için çalışması gerekir.

+1

Bu, kayıt için Rails 3.0.3 gibi çalışır. – coreyward

+0

Bilmekte fayda var, teşekkürler. –

+0

Önerilen yol seeds.rb kullanmaktır. – ironic

7

Ayrıca örneğin sizin seeds.rb dosyasında tanımlayabiliriz:

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

ve koşudan sonra

:

rake db:seed 
0

Gerçekten de

ProductType.create 

kullanmamalısınız senin göçler.

Ben benzer yaptım ama uzun vadede çalışmak garanti edilmez.

Taşıma işlemini çalıştırdığınızda, kullandığınız model sınıfı, geçişi oluşturduğunuz anda değil, geçişi çalıştırdığınız sıradadır. Modelinizi asla geçişi engellememenizi sağlayacak şekilde değiştirmediğinizden emin olmanız gerekir.

Örneğin SQL çalıştıran çok daha iyi şunlardır: hemen hemen benim yaptığım

[{name: 'Type', ..}, .. ].each do |type| 
    execute("INSERT INTO product_types (name) VALUES ('#{type[:name]} ..) 
end