it-swarm.com.de

Was ist der beste Weg, um eine Datenbank in Rails zu erstellen?

Ich habe eine Rechenaufgabe, die einige Anfangsdaten in meiner Rails - App auffüllt. Zum Beispiel Länder, Bundesstaaten, Mobilfunkanbieter usw.

So wie ich es jetzt eingerichtet habe, habe ich eine Reihe von create-Anweisungen in Dateien in/db/fixtures und eine Rechenaufgabe, die sie verarbeitet. Ein Modell, das ich habe, sind beispielsweise Themen. Ich habe eine theme.rb-Datei in/db/fixtures, die so aussieht:

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"

Die Idee hier ist, dass ich ein paar Börsenthemen installieren möchte, mit denen Benutzer beginnen sollen. Ich habe ein Problem mit dieser Methode.

Das Einstellen der ID funktioniert nicht. Das bedeutet, dass ich, wenn ich ein Thema hinzufügen möchte, es als 'Rot' bezeichnen möchte, einfach die Themenanweisung zu dieser Fixture-Datei hinzufügen und die Rake-Task aufrufen möchte, um die Datenbank neu einzuspielen. Wenn ich das tue, werden alle Verknüpfungen unterbrochen, da Designs zu anderen Objekten gehören und sich deren IDs bei dieser Neuinitialisierung ändern.

Meine Frage ist zuallererst: Ist dies ein guter Weg, um mit dem Seeding einer Datenbank umzugehen? In einem früheren Beitrag wurde mir dies empfohlen.

Wenn ja, wie kann ich die IDs hart codieren und gibt es irgendwelche Nachteile?

Wenn nicht, wie kann die Datenbank am besten geimpft werden?

Ich werde lange und durchdachte Antworten zu schätzen wissen, die Best Practices beinhalten.

76
Tony

Aktualisierung, da diese Antworten etwas veraltet sind (obwohl einige noch zutreffen).

Einfaches Feature hinzugefügt in Rails 2.3.4, db/seeds.rb

Bietet eine neue Rechenaufgabe

rake db:seed

Gut zum Auffüllen gängiger statischer Datensätze wie Staaten, Länder usw.

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

* Beachten Sie, dass Sie Fixtures verwenden können, wenn Sie sie bereits erstellt haben, um sie auch mit der Aufgabe db: seed zu füllen, indem Sie Folgendes in Ihre seeds.rb-Datei einfügen (aus der Railscast-Episode):

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

Verwenden Sie für Rails 3.x 'ActiveRecord :: Fixtures' anstelle der 'Fixtures'-Konstante

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

Normalerweise sind zwei Arten von Saatgutdaten erforderlich.

  • Basisdaten , auf die sich der Kern Ihrer Anwendung stützen kann. Ich nenne das die gemeinsamen Samen.
  • Umgebungsdaten Um beispielsweise die App zu entwickeln, ist es nützlich, eine Reihe von Daten in einem bekannten Zustand zu haben, die wir für die lokale Arbeit an der App verwenden können (Die obige Antwort von Factory Girl deckt diese Art von Daten ab.).

Meiner Erfahrung nach stieß ich immer wieder auf die Notwendigkeit dieser beiden Datentypen. Also habe ich ein kleines Juwel, das Rails 'Seeds erweitert zusammengestellt und Sie können unter db/seeds/mehrere gemeinsame Seed-Dateien und unter db/seeds/ENV alle Umgebungs-Seed-Daten hinzufügen, zum Beispiel db/seeds/development .

Ich habe festgestellt, dass dieser Ansatz ausreicht, um meinen Seed-Daten eine gewisse Struktur zu verleihen, und mir die Möglichkeit gibt, meine Entwicklungs- oder Staging-Umgebung in einem bekannten Zustand einzurichten, indem ich einfach Folgendes ausführe:

rake db:setup

Leuchten sind zerbrechlich und flockig zu pflegen, ebenso wie normale SQL-Dumps.

27
james2m

factory_bot klingt so, als würde es das tun, was Sie erreichen wollen. Sie können alle allgemeinen Attribute in der Standarddefinition definieren und sie dann zum Zeitpunkt der Erstellung überschreiben. Sie können der Fabrik auch eine ID übergeben:

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

Wenn es mit faker verwendet wird, kann es eine Datenbank sehr schnell mit Assoziationen füllen, ohne mit Fixtures herumspielen zu müssen (yuck).

Ich habe Code wie diesen in einer Rechenaufgabe.

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

Mit seeds.rb file oder FactoryBot ist großartig, aber diese eignen sich für feste Datenstrukturen und Tests.

Der Edelstein seedbank gibt Ihnen möglicherweise mehr Kontrolle und Modularität für Ihre Samen. Es fügt Rechenaufgaben ein und Sie können auch Abhängigkeiten zwischen Ihren Samen definieren. Ihre Rake-Aufgabenliste enthält die folgenden Zusätze (z. B.):

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
22
Yuri

Rails hat eine eingebaute Methode, um Daten wie folgt zu setzen hier .

Ein anderer Weg wäre, einen Edelstein für fortgeschrittene oder einfachere Aussaat zu verwenden, wie: seedbank .

Der Hauptvorteil dieses Edelsteins und der Grund, warum ich es verwende, ist, dass es erweiterte Funktionen wie Datenladeabhängigkeiten und Seed-Daten pro Umgebung bietet.

Hinzufügen einer aktuellen Antwort, da diese Antwort zuerst auf Google war.

1
SimonW