2011-01-08 68 views
14

我正在運行Rails 3.0.3,而且我在遷移過程中意外犯了一個錯字:我創建了一個遷移,它創建一個類型爲boolen的新列已經是boolean)。我運行了遷移,Rails沒有提醒我這是一個無效的列,我可以發誓它在以前的版本?關於遷移:未定義的方法`to_sym'爲零:NilClass

現在,每當我嘗試添加,刪除或修改遷移我收到以下錯誤什麼:

undefined method `to_sym' for nil:NilClass

我甚至不能回滾或下降。我保存了數據庫和文件樹的早期版本,但這個問題令我發狂,因爲這不是我第一次見到這種情況。

如何在沒有Rails抱怨的情況下有效地移除列(並且最好不用手工挖掘數據庫)?

回答

6

這是我使用rails遷移的問題。你的名字拼寫錯誤或錯誤。這是你可以做的。

  1. 如果您自問題以來只進行了一次遷移。
  2. rake db:rollback
  3. 這會讓你發現錯誤,你可以改變我將在稍後討論的問題。
  4. 如果這不是最後一次遷移,請繼續使用rake db:rollback,直到您在那裏並且問題得到解決。

問題是這樣的。注意第一個的順序和第二個的拼寫。這兩個問題給我帶來了與你現在相同的情況,即to_sym bs。

例如;

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

讓我知道你是否有更多的問題。

如果您不能rake db:rollback然後進行新的遷移,請刪除提供問題的表並重新生成。我以前必須這樣做。只要確保你的訂單正確。

+3

感謝薩姆不幸的是,‘耙分貝:回滾’仍給我to_sym BS這嚴重需要被固定在Rails中,這是一個公然的問題-_- – 2011-01-08 15:55:31

+0

是的,這真的很蹩腳 – s84 2011-01-08 15:59:38

+2

然後放下你的表並且再次遷移它希望你沒有很多數據:) – s84 2011-01-08 16:00:50

9

正如你在codeglot的註釋中提到的那樣,一旦記錄在你的數據庫中,你在嘗試刪除列時仍然會出現錯誤。

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

爲了克服這個問題,你可以手動遷移運行SQL命令

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

希望這有助於

4

您也可以使用數據庫工具修復數據庫。我遇到了同樣的問題,並且使用了MacOS X的優秀應用程序「Base」。它允許您更改sqlite數據庫的字段類型。

在後臺它只是創建一個新的表與修改後的字段,並從原來的數據複製。爲我工作!

1

如果再次面臨同樣的問題,請嘗試手動刪除數據庫中的故障列。 (有一個很好的Firefox插件叫做SQLite Manager。)

然後運行rollback命令,修復遷移文件中的問題,最後再次遷移。這將幫助您保持Rails遷移的限制。

15

如果您使用SQLite數據庫,則可能會出現此錯誤,因爲SQLLite不提供刪除列功能。 http://www.sqlite.org/faq.html#q11

SQLLite建議您只創建一個臨時表,只需要從原始表中獲得的列,傳輸數據,然後交換表。

1

當我試圖在Rails 4和Ruby 2中創建連接表時,我收到了類似的錯誤。雖然遷移代碼對我來說看起來不錯,但是它是id => true行導致的問題。以下是我遇到錯誤時遷移代碼的樣子。

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 

這是我得到的錯誤 -

== 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>' 

我刪除:id => true和它成功遷移。

我知道這並不完全適用於您的問題。但是如果有人遇到這個問題,很確定他們會找到這個線程。

3

我幾乎完全相同的問題(拼錯了bolean),無法使rake db:rollback工作,也沒有刪除列名(因爲SQLite3),使用Rails 4.0.2。

因爲我不在乎,如果數據庫的數據已被刪除,這是我的固定它:

  1. 刪除整個數據庫rake db:drop
  2. 編輯[timestamp]_migration_name.rb文件,以正確說boolean
  3. 創建數據庫再次rake db:create
  4. 遷移數據rake db:migrate
  5. (重新啓動web服務器,等等!)
0

錯誤:

undefined method `to_sym' for nil:NilClass 

是因爲Rails不知道列的類型引起的。爲什麼它不知道類型?因爲該類型不在schema.rb文件中。在我來說,我找了表的問題,結果發現:

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

我改變了原來的遷移使用浮動的,而不是真實的,問題走了,當我放棄了數據庫,並從頭開始重建它。

在我的情況下,我只使用SQLite進行測試和開發,其中刪除數據庫並從頭開始重建它是一個常規操作。我們使用不同的數據庫,在生產中沒有這個問題,所以更改舊版本的遷移對我很有用。

0

我有同樣的問題,因爲不是「$軌生成reset_digest遷移add_reset_to_users:字符串\

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.

相關問題