2011-01-08 66 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.

相关问题