Rails'te bir veritabanı oluşturmanın en iyi yolu nedir?


82

Raylar uygulamamda bazı ilk verileri dolduran bir komisyon görevim var. Örneğin ülkeler, eyaletler, mobil operatörler vb.

Şimdi kurduğum yol, / db / fikstürler dosyasında bir sürü oluşturma deyimim ve bunları işleyen bir komisyon görevim var. Örneğin, sahip olduğum modellerden biri temalar. / Db / fikstürleri içinde şuna benzeyen bir theme.rb dosyam var:

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"

Buradaki fikir, kullanıcıların başlaması için bazı stok temaları yüklemek istemem. Bu yöntemle ilgili bir sorunum var.

Kimliği ayarlamak çalışmıyor. Bu, bir tema eklemeye karar verirsem, buna 'Kırmızı' diyelim, o zaman bu fikstür dosyasına tema ifadesini eklemek ve veritabanını yeniden beslemek için komisyon görevini çağırmak istediğim anlamına gelir. Bunu yaparsam, temalar diğer nesnelere ait olduğu ve bu yeniden başlatma üzerine kimliklerinin değiştiği için tüm bağlantılar kopar.

Benim sorum her şeyden önce, bu bir veritabanı tohumlama işleminin iyi bir yolu mu? Önceki bir gönderide bu bana tavsiye edilmişti.

Öyleyse, kimlikleri nasıl sabit kodlayabilirim ve bunun herhangi bir dezavantajı var mı?

Değilse, veritabanını başlatmanın en iyi yolu nedir?

En iyi uygulamaları içeren uzun ve düşünülmüş yanıtları gerçekten takdir edeceğim.

Yanıtlar:


113

Bu cevaplar biraz güncel olmadığı için güncelleniyor (bazıları hala geçerli olsa da).

Raylar 2.3.4, db / seeds.rb'ye eklenen basit özellik

Yeni bir tırmık görevi sağlar

rake db:seed

Eyaletler, ülkeler vb. Gibi genel statik kayıtları doldurmak için idealdir.

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

* Armatürleri önceden oluşturduysanız, aşağıdakileri seeds.rb dosyanıza (railscast bölümünden) koyarak db: seed göreviyle de doldurmak için kullanabilirsiniz:

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

Rails 3.x için 'Fixtures' sabiti yerine 'ActiveRecord :: Fixtures' kullanın

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

28

Genellikle 2 tür tohum verisi gereklidir.

  • Uygulamanızın çekirdeğinin güvenebileceği temel veriler . Ben buna ortak tohumlar diyorum.
  • Çevresel veriler , örneğin uygulamayı geliştirmek için, uygulama üzerinde yerel olarak çalışmak için kullanabileceğimiz bilinen bir durumda bir sürü veriye sahip olmak yararlıdır (yukarıdaki Fabrika Kızı yanıtı bu tür verileri kapsar).

Deneyimlerime göre, her zaman bu iki tür veriye ihtiyaç duyuyordum. Bu yüzden , Rails'in tohumlarını genişleten ve db / tohumlar / altında birden çok ortak tohum dosyası ve db / tohumlar / ENV altındaki herhangi bir çevresel tohum verisini, örneğin db / seed / development gibi eklemenize izin veren küçük bir mücevher oluşturdum .

Bu yaklaşımın, çekirdek verilerime biraz yapı kazandırmak için yeterli olduğunu ve bana yalnızca şu komutu çalıştırarak geliştirme veya hazırlama ortamımı bilinen bir durumda kurma gücü verdiğini buldum:

rake db:setup

Fikstürlerin bakımı kırılgandır ve düzenli sql dökümleri gibi bakımı zordur.


Kodun mevcut ve kullanıcılardan gelen verilere dayandığı şeyleri açıklamak için "sistem verileri" ve "çalışma zamanı verileri" terimlerini seviyorum. Bazen aralarındaki çizgi bulanıktır.
Tim Abell

27

factory_bot , başarmaya çalıştığınız şeyi yapacak gibi görünüyor. Varsayılan tanımdaki tüm ortak öznitelikleri tanımlayabilir ve ardından bunları oluşturma sırasında geçersiz kılabilirsiniz. Ayrıca fabrikaya bir kimlik de iletebilirsiniz:

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')

Faker ile kullanıldığında, Fixtures (yuck) ile uğraşmak zorunda kalmadan bir veritabanını ilişkilendirmelerle gerçekten hızlı bir şekilde doldurabilir.

Bir komisyon görevinde böyle bir kodum var.

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

11
FactoryGirl aslında armatürler yerine test etmek içindir, ancak aynı zamanda üretime malzeme yüklemek için de kullanılabilir. Tüm varsayılan verileri yüklemek için ön koşul olarak db: migrate içeren bir komisyon görevi kullanın. Tırmık görevini, mevcut verilerin kopyalarını oluşturmayacak kadar akıllı hale getirmeniz gerekebilir.
Bob Aman

2
FactoryGirl'i tohum için kullanmak tavsiye edilmez, bu gönderiyi kontrol edin .
blackbiron

26

seeds.rbFile veya kullanmak FactoryBotharikadır, ancak bunlar sabit veri yapıları ve testleri için harikadır.

seedbankTaş size tohumlara daha fazla kontrol ve modülerliği verebilir. Tırmık görevlerini ekler ve ayrıca tohumlarınız arasındaki bağımlılıkları da tanımlayabilirsiniz. Rake görev listenizde şu ilaveler olacaktır (örneğin):

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

Rails, burada açıklandığı gibi verileri tohumlamak için yerleşik bir yola sahiptir .

Başka bir yol, daha gelişmiş veya daha kolay tohumlama için bir mücevher kullanmaktır, örneğin: seedbank .

Bu cevherin ana avantajı ve onu kullanmamın nedeni, veri yükleme bağımlılıkları ve ortam başına tohum verileri gibi gelişmiş yeteneklere sahip olmasıdır.

Bu cevap Google'da ilk olduğu için güncel bir cevap eklemek.


-3

En iyi yol armatürleri kullanmaktır.

Not: Fikstürlerin doğrudan eklemeler yaptığını ve modelinizi kullanmadığını unutmayın; bu nedenle, verileri dolduran geri aramalarınız varsa bir geçici çözüm bulmanız gerekecektir.


-4

Bunu veritabanı geçişlerine ekleyin, böylece herkes güncelledikçe alır. Ruby / rails kodunda tüm mantığınızı yönetin, böylece hiçbir zaman açık kimlik ayarlarıyla uğraşmak zorunda kalmazsınız.


İlk verileri değiştirmem gerekirse, geçişleri kullanırken işler karışabilir. ikinci yorumun pek mantıklı değil. yabancı anahtarlar aracılığıyla bağlantılar yok edilecek
Tony

c = Category.create (malzeme) p = Post.create (malzeme) p.category = c Kimliklerin açıkça ayarlanmasına gerek yoktur. İlk verileri değiştirirseniz, sadece yeni bir geçiş oluşturursunuz. Çok kolay.
Matt Rogish

bu, ilişkilendirmelerin nesne yaratıldığı anda yapılabileceğini varsayar. İşte mantığınızın başarısız olduğuna inandığım bir örnek ... yanılıyorsam düzeltin. DB'yi şablon temaları ile besliyorum. user id = 1, id = 2 şablonunu ve id = 4 temasını oluşturur. bu noktada, aşağıdaki gibi bir kayıt db'de bulunur: şablon: id = 2, user_id = 1, theme_id = 4. ben şimdi eğer db, tema id = 4 şimdi tema id = 10 yeniden init ... ve daha sonra kullanıcının şablon yanlış temalı
Tony

bu, "yeniden başlatma" ile ne demek istediğinize bağlıdır - sıfırdan başlarsanız, Rails tüm ilişkilendirmeleri otomatik olarak yönetir. Kimlik değerlerini zor kodluyorsanız (kötü !!!), o zaman evet patlayacaktır.
Matt Rogish

tamam ne demek istediğini görmeye başladım ama bu senaryoyu kendi başına yürütmem gerekiyor. Veritabanına bir ülke arama tablosu ekliyorum. ABD => ülke kimliği = 1. daha sonra bir kullanıcı ABD'de bulunan bir restoran yaratır. restoran veritabanı satırında country_id = 1 var. Bu çok yaygındır, değil mi? Daha sonra daha fazla ülke eklemek istediğime karar verdim ... db'yi silip ülke arama tablosunu yeniden doldurursam, artık restoranların ülkesi kimlik aynı olmadığı sürece artık doğru değil. bunu nasıl hallederim?
Tony
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.