2011-01-08 14 views
14

Sto utilizzando Rails 3.0.3 e ho fatto un errore di battitura nella mia migrazione: ho creato una migrazione che crea una nuova colonna con un tipo di boolen (dovrebbe sono stati boolean). Ho eseguito la migrazione e Rails non mi ha avvisato che si trattava di un tipo di colonna non valido, cosa che avrei potuto giurare di aver fatto nelle versioni precedenti?On Migration: metodo non definito `to_sym 'per nil: NilClass

Ora ogni volta che provo ad aggiungere, rimuovere o modificare qualsiasi cosa in una migrazione ottengo il seguente errore:

undefined method `to_sym' for nil:NilClass

non riesco nemmeno a far ritirare o far cadere. Ho una versione precedente del database e dell'albero dei file salvati, ma questo problema mi sta facendo impazzire perché non è la prima volta che ho visto accadere questo.

Come posso rimuovere efficacemente la colonna senza che le Rails si lamentino (e preferibilmente senza scavare manualmente nel database)?

risposta

6

Questo è un problema che ho avuto con le migrazioni dei binari. Hai sbagliato l'ortografia o sbagliato il campo con il suo nome. Ecco cosa puoi fare.

  1. Se si è eseguita una sola migrazione dal problema.
  2. rake db:rollback.
  3. Questo ti porterà all'errore e potrai cambiare il problema di cui parlerò più avanti.
  4. Se non è l'ultima migrazione, continua con rake db:rollback finché non ci sei e il problema è risolto.

Il problema è qualcosa di simile. Notare l'ordine sul primo e l'ortografia sul secondo. Questi sono due problemi che mi hanno dato la stessa situazione in cui ti trovi adesso, ovvero to_sym bs.

Ad esempio;

:books, :integer, :name #here I have `integer` before the name 
:books, :name, :integr #here I have the order right but spelling is a problem. 

Fatemi sapere se avete altre domande.

Se non è possibile fare il rake db:rollback quindi effettuare una nuova migrazione, rilasciare la tabella che dà il problema e rigenerare. Ho dovuto farlo prima. Assicurati di avere il tuo ordine giusto.

+3

Grazie Sam Purtroppo. "Rake db:. Rollback" è ancora mi dà i bs to_sym Questo deve seriamente essere corretto in Rails, è un evidente problema -_- –

+0

sì, è davvero zoppo. – s84

+2

Quindi rilascia il tuo tavolo e esegui di nuovo la migrazione. spero tu non abbia molti dati :) – s84

9

Come hai citato nei tuoi commenti su codeglot una volta che il record è nel tuo database, ottieni comunque l'errore quando tenti di rimuovere la colonna.

:books, :name, :inntegr #here I have the order right but spelling is a problem. 

Per ovviare a questo problema è possibile eseguire manualmente comandi SQL nella migrazione

def self.up 
    execute "ALTER TABLE books DROP COLUMN name" 
    end 

speranza che questo aiuta

+0

L'ho provato https://gist.github.com/spundun/ade33d22ef71bfb61d7d Sto ancora ottenendo 'metodo non definito \' to_sym 'per nil: NilClass /gems/ruby-2.1.1/gems/ activerecord-4.1.0.rc1/lib/active_record/connection_adapters/abstract/schema_definitions.rb: 216: in \ 'column '' – Spundun

4

È inoltre possibile correggere il database utilizzando uno strumento di database. Ho avuto lo stesso problema e ho usato l'ottima applicazione "Base" per MacOS X. Permette di cambiare il tipo di campo dei database sqlite.

Sullo sfondo crea appena una nuova tabella con i campi modificati e copia i dati da quello originale. Ha funzionato per me!

+0

Lei mi ha risparmiato ore di frustrazione questa sera. Grazie. –

+0

Due anni dopo, ha avuto di nuovo lo stesso problema, di nuovo in questa pagina, salvato di nuovo! Grazie! –

1

Se si verifica nuovamente lo stesso problema in caso di rollback, provare a rimuovere manualmente la colonna difettosa nel database. (C'è un bel plugin per Firefox chiamato SQLite Manager.)

Quindi eseguire il comando rollback, correggere il problema nel file di migrazione e infine migrare di nuovo. Questo ti aiuterà a rimanere nei limiti della migrazione di Rails.

15

Se si sta utilizzando il database SQLite, probabilmente si riceve questo errore perché SQLLite non fornisce la funzione di colonna di rilascio. http://www.sqlite.org/faq.html#q11

SQLLite suggerisce di creare una tabella temporanea con solo le colonne necessarie dalla tabella originale, trasferire i dati e quindi scambiare le tabelle.

+2

Augh, non puoi rilasciare una colonna? Che cosa ... sul serio? Ergh. Grazie per il testa a testa. –

+0

Sebbene SQLite non ammetta "ALTER TABLE nome_tabella DROP COLUMN nome_colonna", ciò non significa che non è possibile utilizzare una migrazione remove_column. I binari devono implementare il metodo di tabella temporanea sotto le copertine. Ho una vasta serie di migrazioni in cui rimuovo le colonne dieci volte. Sono arrivato a questa domanda perché ho ricevuto il messaggio di errore specificato solo sulla decima rimozione. –

+0

Sì, ho esaminato il codice di rotaie e l'adattatore SQLite implementa il metodo di tabella temporanea. Si ottiene questo errore perché il metodo della tabella di creazione sta trovando una definizione di colonna con un tipo nil. Questo potrebbe essere un baco di rotaie. –

1

Ho ottenuto un errore simile quando stavo cercando di creare una tabella di join in Rails 4 e Ruby 2. Anche se il codice di migrazione mi sembrava buono, era la riga id => true che causava il problema. Ecco come appariva il mio codice di migrazione quando ho ricevuto l'errore.

class CreateJoinTable < ActiveRecord::Migration 
    def change 
    create_table :table1_table2, :id => true do |t| 
     t.references :table1 
     t.references :table2 
     t.timestamps 
    end 
    end 
end 

Questo è l'errore ho ottenuto -

== CreateJoinTable: migrating ======================================= 
-- create_table(:table1_table2, {:id=>true}) 
rake aborted! 
An error has occurred, this and all later migrations canceled: 

undefined method `to_sym' for true:TrueClass/Users/aswin/.rvm/gems/ruby-2.0.0-p0/gems/activerecord-4.0.0/lib/active_record/connection_adapters/abstract/schema_definitions.rb:215:in `column' 
/Users/aswin/.rvm/gems/ruby-2.0.0-p0/gems/activerecord-4.0.0/lib/active_record/connection_adapters/postgresql_adapter.rb:370:in `column' 
/Users/aswin/.rvm/gems/ruby-2.0.0-p0/gems/activerecord-4.0.0/lib/active_record/connection_adapters/abstract/schema_definitions.rb:68:in `primary_key' 
/Users/aswin/.rvm/gems/ruby-2.0.0-p0/gems/activerecord-4.0.0/lib/active_record/connection_adapters/postgresql_adapter.rb:363:in `primary_key' 
/Users/aswin/.rvm/gems/ruby-2.0.0-p0/gems/activerecord-4.0.0/lib/active_record/connection_adapters/abstract/schema_statements.rb:181:in `create_table' 
/Users/aswin/.rvm/gems/ruby-2.0.0-p0/gems/activerecord-4.0.0/lib/active_record/migration.rb:625:in `block in method_missing' 
/Users/aswin/.rvm/gems/ruby-2.0.0-p0/gems/activerecord-4.0.0/lib/active_record/migration.rb:597:in `block in say_with_time' 
/Users/aswin/.rvm/gems/ruby-2.0.0-p0/gems/activerecord-4.0.0/lib/active_record/migration.rb:597:in `say_with_time' 
/Users/aswin/.rvm/gems/ruby-2.0.0-p0/gems/activerecord-4.0.0/lib/active_record/migration.rb:617:in `method_missing' 
/Users/aswin/Code/webbloks/db/migrate/20131101044153_create_property_join_tables.rb:3:in `change' 
/Users/aswin/.rvm/gems/ruby-2.0.0-p0/gems/activerecord-4.0.0/lib/active_record/migration.rb:571:in `exec_migration' 
/Users/aswin/.rvm/gems/ruby-2.0.0-p0/gems/activerecord-4.0.0/lib/active_record/migration.rb:555:in `block (2 levels) in migrate' 
/Users/aswin/.rvm/gems/ruby-2.0.0-p0/gems/activerecord-4.0.0/lib/active_record/migration.rb:554:in `block in migrate' 
/Users/aswin/.rvm/gems/ruby-2.0.0-p0/gems/activerecord-4.0.0/lib/active_record/connection_adapters/abstract/connection_pool.rb:294:in `with_connection' 
/Users/aswin/.rvm/gems/ruby-2.0.0-p0/gems/activerecord-4.0.0/lib/active_record/migration.rb:553:in `migrate' 
/Users/aswin/.rvm/gems/ruby-2.0.0-p0/gems/activerecord-4.0.0/lib/active_record/migration.rb:709:in `migrate' 
/Users/aswin/.rvm/gems/ruby-2.0.0-p0/gems/activerecord-4.0.0/lib/active_record/migration.rb:959:in `block in execute_migration_in_transaction' 
/Users/aswin/.rvm/gems/ruby-2.0.0-p0/gems/activerecord-4.0.0/lib/active_record/migration.rb:1005:in `block in ddl_transaction' 
/Users/aswin/.rvm/gems/ruby-2.0.0-p0/gems/activerecord-4.0.0/lib/active_record/connection_adapters/abstract/database_statements.rb:202:in `block in transaction' 
/Users/aswin/.rvm/gems/ruby-2.0.0-p0/gems/activerecord-4.0.0/lib/active_record/connection_adapters/abstract/database_statements.rb:210:in `within_new_transaction' 
/Users/aswin/.rvm/gems/ruby-2.0.0-p0/gems/activerecord-4.0.0/lib/active_record/connection_adapters/abstract/database_statements.rb:202:in `transaction' 
/Users/aswin/.rvm/gems/ruby-2.0.0-p0/gems/activerecord-4.0.0/lib/active_record/transactions.rb:209:in `transaction' 
/Users/aswin/.rvm/gems/ruby-2.0.0-p0/gems/activerecord-4.0.0/lib/active_record/migration.rb:1005:in `ddl_transaction' 
/Users/aswin/.rvm/gems/ruby-2.0.0-p0/gems/activerecord-4.0.0/lib/active_record/migration.rb:958:in `execute_migration_in_transaction' 
/Users/aswin/.rvm/gems/ruby-2.0.0-p0/gems/activerecord-4.0.0/lib/active_record/migration.rb:920:in `block in migrate' 
/Users/aswin/.rvm/gems/ruby-2.0.0-p0/gems/activerecord-4.0.0/lib/active_record/migration.rb:916:in `each' 
/Users/aswin/.rvm/gems/ruby-2.0.0-p0/gems/activerecord-4.0.0/lib/active_record/migration.rb:916:in `migrate' 
/Users/aswin/.rvm/gems/ruby-2.0.0-p0/gems/activerecord-4.0.0/lib/active_record/migration.rb:764:in `up' 
/Users/aswin/.rvm/gems/ruby-2.0.0-p0/gems/activerecord-4.0.0/lib/active_record/migration.rb:742:in `migrate' 
/Users/aswin/.rvm/gems/ruby-2.0.0-p0/gems/activerecord-4.0.0/lib/active_record/railties/databases.rake:42:in `block (2 levels) in <top (required)>' 
/Users/aswin/.rvm/gems/ruby-2.0.0-p0/bin/ruby_noexec_wrapper:14:in `eval' 
/Users/aswin/.rvm/gems/ruby-2.0.0-p0/bin/ruby_noexec_wrapper:14:in `<main>' 

ho rimosso :id => true e si migrato con successo.

So che questo non si applica esattamente alla tua domanda. Ma se qualcuno sta avendo questo problema, sono sicuro che troveranno questo thread.

3

avevo quasi esattamente lo stesso problema (avevo scritto male bolean) e non poteva rake db:rollback al lavoro, né far cadere il nome della colonna (a causa di SQLite3), utilizzando Rails 4.0.2.

Come non mi importava se i dati DB è stato cancellato, questo è come ho riparato:

  1. goccia l'intero database rake db:drop
  2. Modificare il file [timestamp]_migration_name.rb di dire correttamente boolean
  3. Creare di nuovo il database
  4. Migra i dati rake db:migrate
  5. (Riavvia il server Web, et voilà!)
0

L'errore:

undefined method `to_sym' for nil:NilClass 

è dovuta a causa Rails non si conosce il tipo della colonna. Perché non conosce il tipo? Perché il tipo non è nel file schema.rb. Nel mio caso ho guardato per la tavola con il problema ed ho trovato:

# Could not dump table "simulation_results" because of following StandardError 
# Unknown type 'real' for column 'elevator_kbtu_site' 

ho cambiato la migrazione originale di utilizzare pescante, invece reale e il problema è andato via quando ho lasciato cadere il database e ricostruito da zero.

Nel mio caso uso solo SQLite per test e sviluppo, in cui il database viene rimosso e ricostruito da zero è un'operazione normale. Usiamo un database diverso che non ha questo problema in produzione, quindi cambiare la migrazione più vecchia funziona per me.

0

Ho avuto lo stesso problema, perché invece "$ rotaie generano add_reset_to_users migrazione reset_digest: stringa \

reset_sent_at:datetime" I miss typed "$rails generate migration add_reset_to_users reset_digest:string\ reset_sent_at:datetime". I first removed the "reset" migration using DB browser for SQLite, then I checked schema.rb file, in that instead of " t.string "reset_digest" " it was " t. "reset_digest" ". I edited it to "t.string" then rails db:migrate VERSION="previous one" and it worked. Now my latest migration is down. I deleted my previous migration file and then executed "$rails generate migration add_reset_to_users reset_digest:string reset_sent_at:datetime", I got the migration file as I wanted now.

Problemi correlati