2016-05-12 3 views
0

Disclaimer: Ich weiß nicht Ruby.ActiveRecord :: Migration unitialized konstanten Fehler.

Ich habe versucht, diese Ruby-Anwendung einzurichten. Ich versuche, zu debuggen, warum ich eine nicht initialisierte Konstante Fehlermeldung erhalten:

rake aborted! 
StandardError: An error has occurred, all later migrations canceled: 

uninitialized constant CreateSyncsTable::Syncs/var/rails/cycs/cycs/db/migrate/20100818122117_create_syncs_table.rb:8:in `up' 

Im Folgenden finden Sie die Dateiinhalte von 20100818122117_create_syncs_table.rb.

class CreateSyncsTable < ActiveRecord::Migration 
    def self.up 
    create_table :syncs do |t| 
     t.timestamps 
     t.integer :remedy_query_low 
     t.integer :remedy_query_high 
    end 
    Sync.create :remedy_query_low => 0, :remedy_query_high => 0 
    end 

    def self.down 
    drop_table :syncs 
    end 
end 

Zu meinem Verständnis versucht Zeile 8, einen neuen Eintrag in die Syncs-Tabelle zu erstellen. Ich weiß nicht genau, warum die Syntax dabei wie folgt:

Sync.create :remedy_query_low => 0, :remedy_query_high => 0 

Ich auch nicht verstehen, warum oder wo „Sync“ kommt. Außerdem weiß ich nicht, welche Konstante nicht initialisiert ist.

Jede Hilfe zum Debuggen wird geschätzt. Für die Aufzeichnung verwende ich CentOS 7, Maria DB und ActiveRecord Version 3.2.18.

  1. Ich überprüfte die API, um zu sehen, ob das helfen würde. Da ich Ruby nicht kenne, finde ich es nicht viel hilfreich.
+0

'Sync' ist ein Modell, sollte es in der' app/models/sync.rb' Datei deklariert werden. – igwan

+0

@torrho hast du dein Problem gelöst? –

Antwort

0

Versuchen in einem Aufruf von ActiveRecord::ModelSchema.reset_column_information wie es den Zusatz „setzt alle zwischengespeicherten Informationen über Spalten, die sie bewirkt, dass bei der nächsten Anfrage neu geladen werden“, so dass Sie Sync Einträge unmittelbar nach der Tabelle erstellen, zu schaffen, in der Migration:

class CreateSyncsTable < ActiveRecord::Migration 
    def self.up 
    create_table :syncs do |t| 
     t.timestamps 
     t.integer :remedy_query_low 
     t.integer :remedy_query_high 
    end 
    Sync.reset_column_information 
    Sync.create :remedy_query_low => 0, :remedy_query_high => 0 
    end 

    def self.down 
    drop_table :syncs 
    end 
end 

persönlich würde ich empfehlen die Sync.create :remedy_query_low => 0, :remedy_query_high => 0 Aussage komplett zu entfernen, da ich Rails Migrationen Meinung nach am besten für Schema nur Migrationen verwendet werden, und Datenmigrationen am besten in rake Aufgaben (ein großer Grund setzen, warum sein kann gefunden here).

0

In diesem Fall bezieht sich Sync auf ein Modell. Sie sollten haben eine Datei in namens sync.rb, die die Modelldefinition für die Sync-Klasse ist. Dies ist eine Rails-Konvention zum Definieren von Modellen.

Sie können Modelle in Ihren Migrationen verwenden (Sie haben sich eine Migration angesehen). Es wird jedoch im Allgemeinen nicht empfohlen, die Modelle Ihrer App bei der Migration zu verwenden, da dies zu Konflikten führen kann.

Was empfohlen wird ist ein Proxy-Modell in der Migration zu definieren, die für die Zwecke der Migration an die Stelle des App-Modell nimmt. Sie deklarieren das Proxy-Modell oben in Ihrer Migrationsdatei, sodass es lokal für die Migration ist.

diesen Code Versuchen:

class Sync < ActiveRecord::Base 
end 

class CreateSyncsTable < ActiveRecord::Migration 
    def self.up 
    create_table :syncs do |t| 
     t.timestamps 
     t.integer :remedy_query_low 
     t.integer :remedy_query_high 
    end 

    # Reset ActiveRecord cache of Sync details 
    Sync.reset_column_information 

    Sync.create :remedy_query_low => 0, :remedy_query_high => 0 
    end 

    def self.down 
    drop_table :syncs 
    end 
end 

Der zusätzliche Aufruf von Sync.reset_column_information sagt Rails den Cache von Informationen über das Modell zurückgesetzt werden, da die Tabellenstruktur geändert hat. Dies verhindert Probleme, z. B. den Zugriff auf die neuen Spalten, die bei der Migration hinzugefügt wurden.

+0

@torrho Hat dies Ihre Frage beantwortet? Wenn ja, klicke bitte auf das Häkchen neben der Antwort, um es zu akzeptieren. Das Häkchen wird grün. Upvotes sind auch immer willkommen! –

Verwandte Themen