Ich habe eine Rake-Aufgabe, die einige Anfangsdaten in meiner Rails-App auffüllt. Zum Beispiel Länder, Staaten, Mobilfunkanbieter usw.
Ich habe es jetzt so eingerichtet, dass ich eine Reihe von Erstellungsanweisungen in Dateien in / db / fixtures und eine Rake-Task habe, 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 einige Standardthemen installieren möchte, mit denen Benutzer beginnen können. Ich habe ein Problem mit dieser Methode.
Das Einstellen der ID funktioniert nicht. Das heißt, wenn ich mich entscheide, ein Thema hinzuzufügen, nennen wir es 'Rot', dann möchte ich einfach die Theme-Anweisung zu dieser Fixture-Datei hinzufügen und die Rake-Task aufrufen, um die Datenbank neu zu säen. Wenn ich das mache, weil alle Themen zu anderen Objekten gehören und sich ihre ID bei dieser Neuinitialisierung ändert, sind alle Links unterbrochen.
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 gesetzt werden?
Ich werde lange und durchdachte Antworten, die Best Practices beinhalten, wirklich zu schätzen wissen.
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 beim Erstellen überschreiben. Sie können auch eine ID an die Fabrik übergeben:
Wenn es mit faker verwendet wird, kann es eine Datenbank sehr schnell mit Assoziationen füllen, ohne mit Fixtures (yuck) herumspielen zu müssen.
Ich habe Code wie diesen in einer Rechenaufgabe.
quelle
Die Verwendung von
seeds.rb
Datei oderFactoryBot
ist großartig, aber diese eignen sich jeweils hervorragend für feste Datenstrukturen und Tests.Der
seedbank
Edelstein 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 Seeds definieren. Ihre Rake-Aufgabenliste enthält folgende Ergänzungen (z. B.):quelle
Rails verfügt über eine integrierte Methode zum Setzen von Daten, wie hier erläutert .
Ein anderer Weg wäre, einen Edelstein für fortgeschrittenere oder einfachere Aussaat zu verwenden, wie zum Beispiel: Samenbank .
Der Hauptvorteil dieses Edelsteins und der Grund, warum ich es verwende, besteht darin, dass es über erweiterte Funktionen wie Abhängigkeiten beim Laden von Daten und Seed-Daten pro Umgebung verfügt.
Hinzufügen einer aktuellen Antwort, da diese Antwort zuerst bei Google war.
quelle
Der beste Weg ist, Scheinwerfer zu verwenden.
Hinweis: Beachten Sie, dass Fixtures direkte Einfügungen durchführen und Ihr Modell nicht verwenden. Wenn Sie also Rückrufe haben, die Daten füllen, müssen Sie eine Problemumgehung finden.
quelle
Fügen Sie es bei Datenbankmigrationen hinzu, damit jeder es beim Aktualisieren erhält. Behandeln Sie Ihre gesamte Logik im Ruby / Rails-Code, damit Sie sich nie mit expliziten ID-Einstellungen herumschlagen müssen.
quelle