关于迁移:nil的未定义方法`to_sym’:NilClass

我正在运行Rails 3.0.3并且在我的迁移中意外地犯了一个错字:我创建了一个迁移,它创建了一个boolen类型的新列(它应该是boolean )。 我运行了迁移,Rails没有警告我这是一个无效的列类型,我可以在以前的版本中发誓它吗?

现在每当我尝试添加,删除或修改迁移中的任何内容时,我都会收到以下错误:

nil的未定义方法`to_sym’:NilClass

我甚至无法回滚或丢弃。 我有一个早期版本的数据库和文件树保存,但这个问题让我发疯,因为这不是我第一次看到这种情况发生。

如何在没有Rails抱怨的情况下有效地删除列(最好不要手动挖掘数据库)?

这是我在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然后进行新的迁移,删除表中的问题并重新生成。 我以前必须这样做。 只需确保您的订单正确。

如果您使用的是SQLite数据库,则可能会收到此错误,因为SQLLite不提供删除列function。 http://www.sqlite.org/faq.html#q11

SQLLite建议您创建一个临时表,其中只包含原始表中所需的列,传输数据,然后交换表。

正如您在对数据库中的记录进行评论时所提到的那样,在尝试删除列时仍会出现错误。

  :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 

希望这可以帮助

您还可以使用数据库工具修复数据库。 我遇到了同样的问题,并为MacOS X使用了很棒的应用程序“Base”。它允许您更改sqlite数据库的字段类型。

在后台,它只是创建一个包含已修改字段的新表,并复制原始数据。 为我工作!

我有几乎完全相同的问题(拼写错误的bolean )并且无法使用Rails 4.0.2使用rake db:rollback工作,也不会删除列名(因为SQLite3)。

由于我不在乎数据库数据是否被删除,这就是我修复它的方法:

  1. 删除整个数据库rake db:drop
  2. 编辑[timestamp]_migration_name.rb文件以正确说出boolean
  3. 再次创建数据库rake db:create
  4. 迁移数据rake db:migrate
  5. (重新启动Web服务器,等等!)

如果在再次回滚时遇到相同问题,请尝试手动删除数据库中的错误列。 (有一个很好的Firefox插件叫做SQLite Manager。)

然后运行rollback命令,在迁移文件中修复问题,最后再次迁移。 这将帮助您保持Rails迁移的约束。

当我尝试在Rails 4和Ruby 2中创建连接表时,我遇到了类似的错误。虽然迁移代码对我来说很好,但是id => true line导致了这个问题。 这是我收到错误时我的迁移代码的样子。

 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 ' /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 `
'

我删除了:id => true ,它已成功迁移。

我知道这不完全适用于您的问题。 但是,如果有人遇到这个问题,相当肯定他们会找到这个post。

错误:

 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' 

我将原始迁移更改为使用float而不是real,当我删除数据库并从头开始重建时,问题就消失了。

在我的情况下,我只使用SQLite进行测试和开发,其中删除数据库并从头开始重建是一项常规操作。 我们使用的是另一个在生产中没有此问题的数据库,因此更改旧迁移对我有用。

我有同样的问题,因为而是“$ rails生成迁移add_reset_to_users reset_digest:string \

reset_sent_at:datetime“我想念打字”$ rails生成迁移add_reset_to_users reset_digest:string \ reset_sent_at:datetime“。我首先使用DB浏览器删除了”重置“迁移,然后我检查了schema.rb文件,而不是”t .string“reset_digest”“它是”t。 “reset_digest”“。我将其编辑为”t.string“然后rails db:migrate VERSION =”previous one“并且它工作正常。现在我的最新迁移已关闭。我删除了我之前的迁移文件,然后执行了”$ rails generate migration“ add_reset_to_users reset_digest:string reset_sent_at:datetime“,我现在得到了我想要的迁移文件。