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

Eri*_* R. 15 migration ruby-on-rails ruby-on-rails-3

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

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

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

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

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

vor*_*rak 15

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

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

  • Augh,你不能放一个栏目?什么......认真?Ergh.谢谢你的提醒. (2认同)

Sch*_*ems 9

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

 :books, :name, :inntegr #here I have the order right but spelling is a problem.
Run Code Online (Sandbox Code Playgroud)

要解决此问题,您可以在迁移中手动运行sql命令

  def self.up
    execute "ALTER TABLE books DROP COLUMN name"
  end
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助


the*_*gah 6

这是我在使用rails迁移时遇到的问题.你用一个名字拼错或拼错了一个字段.这是你可以做的.

  1. 如果您自问题以来只进行了一次迁移.
  2. rake db:rollback.
  3. 这会让你犯错,你可以改变我稍后会讨论的问题.
  4. 如果不是最后一次迁移继续进行,rake db:rollback直到你在那里并且问题得到解决.

问题是这样的.注意第一个上的顺序和第二个上的拼写.这两个问题给我的情况与你现在的情况相同,那就是to_symbs.

例如;

 :books, :integer, :name #here I have `integer` before the name
 :books, :name, :integr #here I have the order right but spelling is a problem.
Run Code Online (Sandbox Code Playgroud)

如果您有更多问题,请与我们联系.

如果您无法rake db:rollback进行新迁移,请删除表中的问题,然后重新生成.我以前必须这样做.只需确保您的订单正确.

  • 谢谢山姆.不幸的是"rake db:rollback"仍然给了我to_sym bs.这真的需要在Rails中修复,这是一个明显的问题-_- (3认同)
  • 然后放下桌子并再次迁移它.希望你没有太多的数据:) (2认同)