我正在运行Rails 3.0.3并且在我的迁移中意外地犯了一个错字:我创建了一个迁移,它创建了一个类型为boolen
的新列(应该是boolean
) 。我运行了迁移,Rails没有警告我这是一个无效的列类型,我可以在之前的版本中发誓这样做了吗?
现在每当我尝试添加,删除或修改迁移中的任何内容时,我都会收到以下错误:
nil的未定义方法`to_sym':NilClass
我甚至无法回滚或丢弃。我有一个早期版本的数据库和文件树保存,但这个问题让我发疯,因为这不是我第一次看到这种情况发生。
如何在没有Rails抱怨的情况下有效删除列(最好不要手动挖掘数据库)?
答案 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迁移时遇到的问题。你的名字错误地拼写或拼错了一个字段。这是你可以做的。
rake db:rollback
。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 :(得分:4)
您还可以使用数据库工具修复数据库。我遇到了同样的问题,并为MacOS X使用了很棒的应用程序“Base”。它允许您更改sqlite数据库的字段类型。
在后台,它只是创建一个包含已修改字段的新表,并从原始数据中复制数据。为我工作!
答案 4 :(得分:3)
我有几乎完全相同的问题(拼写错误bolean
)并且无法使用rake db:rollback
工作,也没有使用Rails 4.0.2删除列名(因为SQLite3)。
由于我不在乎数据库数据是否被删除,这就是我修复它的方法:
rake db:drop
[timestamp]_migration_name.rb
文件以正确说出boolean
rake db:create
rake db:migrate
答案 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”,我现在得到了迁移文件。