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

时间:2011-01-08 15:24:44

标签: ruby-on-rails migration ruby-on-rails-3

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

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

  

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

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

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

9 个答案:

答案 0 :(得分:15)

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

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

答案 1 :(得分:9)

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

 :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

希望这会有所帮助

答案 2 :(得分:6)

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

  1. 如果您自问题以来只进行了一次迁移。
  2. rake db:rollback
  3. 这会让你犯错,你可以改变我稍后会讨论的问题。
  4. 如果不是最后一次迁移,请继续使用rake db:rollback,直到您在那里并且问题得到解决。
  5. 问题是这样的。注意第一个上的顺序和第二个上的拼写。这两个问题给了我现在和你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 :(得分:4)

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

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

答案 4 :(得分:3)

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

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

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

答案 5 :(得分:1)

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

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

答案 6 :(得分: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,并且已成功迁移。

我知道这不完全适用于你的问题。但如果有人遇到这个问题,请相信他们会找到这个帖子。

答案 7 :(得分: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'

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

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

答案 8 :(得分:0)

我遇到了同样的问题,因为“$ 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”,我现在得到了迁移文件。