Frage

Erfahrene mit Rails / Active 2.1.1

  • Sie erstellen eine erste Version mit (zum Beispiel) Ruby-Skript \ erzeugt Gerüst Produkttitel: string Beschreibung: Text image_url: string
  • Diese erstellen (zum Beispiel) eine Migrationsdatei namens 20080910122415_create_products.rb
  • Sie wenden die Migration mit rake db: migrate
  • Nun, Sie ein Feld der Produkttabelle mit Ruby-Skript hinzufügen \ migration add_price_to_product Preis generieren: dezimal
  • Diese Migrationsdatei erstellen namens 20080910125745_add_price_to_product.rb
  • Wenn Sie versuchen, rake db auszuführen: wandern, es wird die erste Migration tatsächlich zurückkehren, nicht für die nächste! So wird Ihre Produkttabelle zerstört werden!
  • Aber wenn man allein lief rake, hätte es Ihnen gesagt, dass eine Migration anstand

Pls beachten Sie, dass die Anwendung rake db:. Migration (sobald der Tisch zerstört wurde) werden alle Migrationen anwenden, um

Die einzige Abhilfe, die ich gefunden ist, die Version der neuen Migration angeben, wie in:

rake db:migrate version=20080910125745

Also ich frage mich: ist dies ein erwartetes neues Verhalten

War es hilfreich?

Lösung

Sie sollten in der Lage sein zu verwenden,

rake db:migrate:up 

, um es zu zwingen, vorwärts zu gehen, aber dann laufen Sie Gefahr, fehlende verschachtelte Migrationen von anderen Menschen in Ihrem Team

Wenn Sie ausführen

rake db:migrate 

zweimal, wird es erneut alle Migrationen.

mir das gleiche Verhalten an den Fenstern mit SQLite begegnen, es könnte ein Fehler spezifisch solche Umgebung sein.

Bearbeiten - fand ich, warum. In der railstie database.rake Aufgabe haben Sie den folgenden Code:

desc "Migrate the database through scripts in db/migrate. Target specific version with VERSION=x. Turn off output with VERBOSE=false."
task :migrate => :environment do
  ActiveRecord::Migration.verbose = ENV["VERBOSE"] ? ENV["VERBOSE"] == "true" : true
  ActiveRecord::Migrator.migrate("db/migrate/", ENV["VERSION"] ? ENV["VERSION"].to_i : nil)
  Rake::Task["db:schema:dump"].invoke if ActiveRecord::Base.schema_format == :ruby
end

Dann in meinen Umgebungsvariablen Ich habe

echo %Version% #=> V3.5.0f

in Ruby

ENV["VERSION"] # => V3.5.0f
ENV["VERSION"].to_i #=>0 not nil !

damit die Rechenaufgabe Anrufe

ActiveRecord::Migrator.migrate("db/migrate/", 0)

und in Activerecord :: Migrator haben wir:

class Migrator#:nodoc:
  class << self
    def migrate(migrations_path, target_version = nil)
      case
        when target_version.nil?              then up(migrations_path, target_version)
        when current_version > target_version then down(migrations_path, target_version)
        else                                       up(migrations_path, target_version)
      end
    end

Ja, rake db:migrate VERSION=0 ist die lange Version für rake db:migrate:down

Bearbeiten - ich würde den Leuchtturm Bug gehen aktualisieren, aber ich die Super-Firma Proxy verbieten, dass ich dort verbinden

In der Zwischenzeit können Sie auf ungesetzt Version versuchen, bevor Sie wandern rufen ...

Andere Tipps

ich respektvoll widersprechen Tom! Diese ist ein Fehler !! V3.5.0f ist keine gültige Version für Rake-Migrationen. Rake sollte es nicht zu migrieren verwenden: nach unten, nur weil Rubin zu prüfen, entschied, dass „V3.5.0f“ .to_i 0 ...

Rake sollte laut, dass VERSION beklagen ist nicht gültig, so dass die Nutzer wissen, was los ist (Unter uns gesagt, die Überprüfung, dass die Version eine YYYYMMDD formated Zeitstempel integer durch Umwandlung ist ein wenig Licht)

[IE6 Verdammt, die ich nicht zulassen Kommentar! und nein, ich kann nicht Browser dank der Unternehmen] ändern

Dies ist nicht das erwartete Verhalten. Ich werde berichten dies als Fehler auf Leuchtturm vorschlagen, aber ich sehe, du hast bereits so fertig! Wenn Sie mehr Informationen (einschließlich OS / database / Ruby-Version) zur Verfügung stellen werde ich einen Blick darauf werfen.

Jean,

Vielen Dank für Ihre Untersuchung. Du hast Recht, und tatsächlich glaube ich Ihnen einen schweren Fehler entdeckt haben, die Arten ‚Designs Bug‘.

Was passiert, ist, dass Rake wird greifen, was Wert, den Sie in der Befehlszeile übergeben und speichern sie als Umgebungsvariablen. Die Rake-Aufgaben, die schließlich genannt werden erhalten nur werden diese Werte aus den Umgebungsvariablen ziehen. Wenn db: Abfragen ENV migrieren [ "VERSION"], fordert er tatsächlich die Version Parameter, die Sie Rake-Set aufrufen. Wenn Sie rake db nennen. Migrieren, müssen Sie nicht jede Version passieren

Aber wir haben eine Umgebungsvariable namens VERSION haben, die für andere Zwecke durch ein anderes Programm (ich weiß nicht, welche noch) nicht festgelegt wurde. Und die Jungs hinter Rake (oder hinter database.rake) haben nicht gedacht, das passieren würde. Das ist ein Design-Fehler. Zumindest könnten sie spezifischere Variablennamen wie „RAKE_VERSION“ oder „RAKE_PARAM_VERSION“ statt nur „VERSION“.

verwendet haben

Tom, ich werde auf jeden Fall nicht in der Nähe, aber meinen Bug-Report auf Leuchtturm bearbeiten, um diese neuen Erkenntnisse widerspiegeln.

Und nochmals vielen Dank Jean für Ihre Hilfe. Ich habe diesen Fehler auf Leuchtturm geschrieben wie 5 Tage Agao und noch keine Antwort bekommen!

Rollo

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