2013-08-14 13 views
16

Also arbeite ich an der Migration dieser PHP-Site mit einer vorhandenen Datenbank, die ich nicht auf Rails umstellen kann. Es gibt eine Tabelle: Quotes mit einer Spalte mit dem Namen type. Jedes Mal, wenn ich versuche, ein Modell dafür schaffen und die Art festgelegt, es sagt mir folgende Fehlermeldung:Rails: Ungültiger Single-Table-Vererbungstyp Fehler

ActiveRecord::SubclassNotFound (Invalid single-table inheritance type: HOME is not a subclass of Quotes)

Ich verstehe nicht, warum es seine Erben denkt, weil es nicht angenommen hat, zu. Meine erstellen Methode sieht so aus:

Wenn ich den Typ auskommentiere, funktioniert alles gut. Aber mit dem Tipp es Fehler.

Antwort

49

Ich löste dies, indem ich die Modelle vererbung_spalte auf null einstellte. Active Record Modelle können aus einer Tabelle durch das :type Attribut erben, die inheritance_column auf Null Einstellung dieses Attribut Entfernt so dass Sie eine Datenbankspalte haben genannt type

class Quote < ActiveRecord::Base 
    self.inheritance_column = nil 
end 
+0

Danke, das wies mich in die richtige Richtung. Ich hatte eine Spalte namens "type" und es verursachte den Fehler. – mack

3

Ich hasse es, potentielle gotchas tief im Code vor allem in der intial Prozesse wie das Erzeugen eines Modells. Besser, nur das reservierte Wort zu etwas anderem zu ändern und sich freizugeben, um Vererbungsspalte später zu nutzen, wenn die Notwendigkeit auftaucht. Eine sauberere Lösung ist hier aufgeführt ->rename a database column name using migration

Es liest;

  1. Execute $> Schienen erzeugen Migration ChangeColumnName wo ChangeColumnName der Name unserer Migration ist. Dies kann ein beliebiger Name sein. Jetzt
  2. , bearbeiten Sie die erzeugte Migrationsdatei an db/Migration/_change_column_name.rb

    class ChangeColumnName < ActiveRecord::Migration 
    def change 
    rename_column :table_name, :old_column, :new_column 
    end 
    end 
    
  3. $> rake db: migrate

Sie Controller und Ansicht bearbeiten haben Dateien z.B. wenn der Modellname Produkt ist, dann werden Sie wahrscheinlich bearbeiten diese Dateien

  1. /app/views/products/_form.html.erb
  2. /app/views/products/show.html.erb
  3. /app/controllers/products_controller.erb
  4. /app/views/products/index.html.erb
+0

Obwohl ich zustimme, dass dies die beste Vorgehensweise ist, beinhaltete mein Problem die Verwendung einer Legacy-Datenbank, in der ich nicht in der Lage war, Dinge zu ändern. –

Verwandte Themen