2013-08-14 10 views
16

Quindi, sto lavorando alla migrazione di questo sito php con un database esistente che non posso modificare su Rails. C'è una tabella: Quotes con una colonna denominata type. Ogni volta che provo e creare un modello di questo e impostare il tipo, mi dice il seguente errore:Rails: errore di ereditarietà del tipo a tabella singola non valida

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

Non capisco perché pensa che la sua eredita perché non dovrebbe. Il mio metodo di creazione è il seguente:

quote = Quotes.create(
    agent_id: agent.id, 
    client_id: client.id, 
    type: 'HOME', 
    status: 0, 
    date_created: DateTime.now 
) 

Se commento il tipo, tutto funziona correttamente. Ma con il Type errori.

risposta

49

Ho risolto questo impostando i modelli inheritance_column su zero. I modelli record attivo possono ereditare da una tabella tramite l'attributo :type, impostando l'inheritance_column a zero rimuove tale attributo che consente di avere una colonna di database denominato type

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

Grazie, questo mi ha segnalato nella giusta direzione. Ho avuto una colonna denominata "tipo" e stava causando l'errore. – mack

3

Odio avere potenziali grattacapi profonde nel codice specialmente nel intial processi come la generazione di un modello. Meglio solo cambiare la parola riservata a qualcos'altro e liberarti per trarre vantaggio dalla colonna di ereditarietà in seguito, se si presenta la necessità. Una soluzione più pulita è elencata qui ->rename a database column name using migration

Si legge;

  1. Execute $> rotaie generano migrazione ChangeColumnName dove, ChangeColumnName è il nome della nostra migrazione. Questo può essere un nome qualsiasi.
  2. Ora, modificare il file di migrazione generato in db/migrate/_change_column_name.rb

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

si dovrà modificare controller e visualizzare i file ad esempio se il nome del modello è prodotto allora è probabile che modificano questi file

  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

Mentre sono d'accordo che è la migliore pratica, il mio problema riguardava l'uso di un database legacy in cui non avevo la possibilità di cambiare le cose. –

Problemi correlati