Frage

Ich habe Leuchten mit ersten Daten, die in meiner Datenbank befinden muss (Länder, Regionen, Träger, etc.). Ich habe eine Aufgabe rake db: Samen, die eine Datenbank Saatgut wird

.
namespace :db do
  desc "Load seed fixtures (from db/fixtures) into the current environment's database." 
  task :seed => :environment do
    require 'active_record/fixtures'

    Dir.glob(RAILS_ROOT + '/db/fixtures/yamls/*.yml').each do |file|
      Fixtures.create_fixtures('db/fixtures/yamls', File.basename(file, '.*'))
    end
  end
end

Ich bin ein bisschen besorgt, weil diese Aufgabe meiner Datenbank sauber wischt und lädt die Anfangsdaten. Die Tatsache, dass dies überhaupt möglich ist, mehr zu tun als einmal auf der Produktion schreckt den Mist aus mir heraus. Ist das normal und muss ich nur vorsichtig sein? Oder zum Schutz der Menschen in der Regel eine Aufgabe wie diese in irgendeiner Weise?

War es hilfreich?

Lösung

Seeding Daten mit Vorrichtungen sind eine extrem schlechte Idee.

Leuchten sind nicht validiert und da die meist Rails-Entwickler Datenbank Einschränkungen nicht verwenden diese bedeuten, dass Sie leicht ungültige oder unvollständige Daten in der Produktionsdatenbank eingefügt bekommen können.

Leuchten setzten auch seltsames Primärschlüssel-IDs standardmäßig, die nicht unbedingt ein Problem ist, aber ärgerlich ist, mit zu arbeiten.

Es gibt viele Lösungen für diese. Mein persönlicher Favorit ist eine Rake Aufgabe, einen Ruby-Skript ausgeführt wird, die einfach Active verwendet Datensätze einzufügen. Dies ist, was 3 Rails mit db:seed tun, aber Sie können dies ganz einfach selbst schreiben.

ich ergänzen dies mit einer Methode, die ich zu Activerecord :: Base genannt create_or_update hinzufügen. Mit diesem kann ich den Samen Skript mehrmals ausgeführt, alte Datensätze zu aktualisieren, anstatt eine Ausnahme zu werfen.

Ich schrieb vor einiger Zeit einen Artikel über diese Techniken Laden Seed-Daten genannt .

Andere Tipps

Für den ersten Teil Ihrer Frage, ja würde ich etwas Vorsicht habe nur eine Aufgabe wie diese in der Produktion für den Betrieb. Ich habe einen Schutz wie dies in meinem Bootstrapping / Impfen Aufgabe:

task :exit_or_continue_in_production? do
  if Rails.env.production?
    puts "!!!WARNING!!! This task will DESTROY " +
         "your production database and RESET all " +
         "application settings"
    puts "Continue? y/n"
    continue = STDIN.gets.chomp
    unless continue == 'y'
      puts "Exiting..."
      exit! 
    end
  end
end

Ich habe erstellt dieser Kern einem bestimmten Kontext.

Für den zweiten Teil der Frage - in der Regel wirklich Sie wollen zwei Dinge: a) sehr leicht die Datenbank Impfen und die Anwendung für die Entwicklung der Einrichtung, und b) Bootstrapping die Anwendung auf dem Produktionsserver (wie: admin user einfügen, Erstellen von Ordnern Anwendung hängt von usw.).

würde ich verwenden Vorrichtungen für die Aussaat in der Entwicklung - jeder aus dem Team sieht dann die gleichen Daten in der App und das, was in der App steht im Einklang mit dem, was in Tests ist. (I wickeln Normalerweise rake app:bootstrap, rake app:seed rake gems:install, etc in rake app:install, so dass jeder auf der App von nur Klonen des Repo- und läuft diese eine Aufgabe arbeiten können.)

Ich würde jedoch nie Vorrichtungen verwendet für die Aussaat / Bootstrapping auf Produktionsserver. Natürlich setzen die gleiche Logik in Ihrer eigenen db/seed.rb Aufgabe Rails' rake app:seed ist für diese Aufgabe wirklich gut, aber Sie können, wie andere darauf hingewiesen.

Rails 3 wird diese Lösung für Sie eine seed.rb-Datei.

http://github.com/brynary/rails/commit/4932f7b38f72104819022abca0c952ba6f9888cb

Wir haben eine Reihe von Best Practices aufgebaut, das wir für die Aussaat Daten verwenden. Wir setzen stark auf dem Aussäen und wir haben einige einzigartige Anforderungen, da wir Multi-Tenant-Systeme müssen auf Saatgut. Hier einige Best Practices wir verwendet haben:

  1. Leuchten sind nicht die beste Lösung, aber man sollte immer noch speichern Sie Ihre Samen Daten in etwas anderes als Rubin. Ruby-Code Samen zum Speichern von Daten neigt sich wiederholende zu bekommen, und die Daten in einer Datei speichert parseable bedeutet, dass Sie generische Code schreiben können Ihre Samen in einer konsistenten Art und Weise zu handhaben.
  2. Wenn du gehst, um potenziell Samen zu aktualisieren, einen Marker Spalt mit dem Namen etwas wie code verwenden, um Ihre Samen zu Ihrer eigentlichen Datendatei zu entsprechen. Verlassen Sie sich nie auf ids konsistent zwischen den Umgebungen.
  3. Überlegen Sie, wie Sie vorhandene Saatgut Daten aktualisiert behandeln möchten. Gibt es eine Möglichkeit, dass Nutzer diese Daten geändert haben? Wenn ja, sollten Sie die Informationen des Benutzers pflegen anstatt überschrieben mit Seed-Daten?

Wenn Sie Interesse an einige der Möglichkeiten, wir Säen, haben wir sie in ein Juwel verpackt genannt SeedOMatic .

Wie wäre es nur die Aufgabe, aus dem Produktionsserver zu löschen, sobald Sie die Datenbank ausgesät haben?

Ich hatte gerade eine interessante Idee ...

Was ist, wenn Sie \ db \ Samen erstellt \ und hinzugefügt Migration-Style-Dateien:

Datei: 200907301234_add_us_states.rb

class AddUsStates < ActiveRecord::Seeds

  def up
    add_to(:states, [
      {:name => 'Wisconsin', :abbreviation => 'WI', :flower => 'someflower'},
      {:name => 'Louisiana', :abbreviation => 'LA', :flower => 'cypress tree'}
      ]
    end
  end

  def down
    remove_from(:states).based_on(:name).with_values('Wisconsin', 'Louisiana', ...)
  end
end

abwechselnd:

  def up
    State.create!( :name => ... )
  end

Auf diese Weise könnten Sie Migrationen und Samen in einer Reihenfolge auszuführen, die ihnen erlauben würde, mehr friedlich koexistieren.

Gedanken?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top