Исключение, сгенерированное во время миграции rename_column - PullRequest
3 голосов
/ 13 октября 2010

Я пытаюсь изменить столбец в моей sqlite DB через миграцию ... и я понятия не имею, что я делаю с RoR, поэтому, пожалуйста, будьте осторожны!

Вот миграция, япытаясь запустить.

class FixContactIdColumn < ActiveRecord::Migration
  def self.up
    rename_column :calls, :contact, :contact_id
  end

  def self.down
  end
end

И вот исключение, которое он генерирует.

brad@brad-vm:~/www/contactly$ vim db/migrate/20101013020151_fix_contact_id_column.rb
brad@brad-vm:~/www/contactly$ rake db:migrate --trace
(in /home/brad/www/contactly)
** Invoke db:migrate (first_time)
** Invoke environment (first_time)
** Execute environment
** Execute db:migrate
==  FixContactIdColumn: migrating =============================================
-- rename_column(:calls, :contact, :contact_id)
rake aborted!
An error has occurred, this and all later migrations canceled:

undefined method `to_sym' for nil:NilClass
/usr/lib/ruby/1.8/active_support/whiny_nil.rb:52:in `method_missing'
/usr/lib/ruby/1.8/active_record/connection_adapters/abstract/schema_definitions.rb:480:in `column'
/usr/lib/ruby/1.8/active_record/connection_adapters/sqlite_adapter.rb:363:in `copy_table'
/usr/lib/ruby/1.8/active_record/connection_adapters/sqlite_adapter.rb:357:in `each'
/usr/lib/ruby/1.8/active_record/connection_adapters/sqlite_adapter.rb:357:in `copy_table'
/usr/lib/ruby/1.8/active_record/connection_adapters/abstract/schema_statements.rb:104:in `create_table'
/usr/lib/ruby/1.8/active_record/connection_adapters/sqlite_adapter.rb:355:in `copy_table'
/usr/lib/ruby/1.8/active_record/connection_adapters/sqlite_adapter.rb:349:in `move_table'
/usr/lib/ruby/1.8/active_record/connection_adapters/sqlite_adapter.rb:342:in `alter_table'
/usr/lib/ruby/1.8/active_record/connection_adapters/abstract/database_statements.rb:136:in `transaction'
/usr/lib/ruby/1.8/active_record/connection_adapters/sqlite_adapter.rb:341:in `alter_table'
/usr/lib/ruby/1.8/active_record/connection_adapters/sqlite_adapter.rb:311:in `rename_column'
/usr/lib/ruby/1.8/active_record/migration.rb:352:in `send'
/usr/lib/ruby/1.8/active_record/migration.rb:352:in `method_missing'
/usr/lib/ruby/1.8/active_record/migration.rb:328:in `say_with_time'
/usr/lib/ruby/1.8/benchmark.rb:293:in `measure'
/usr/lib/ruby/1.8/active_record/migration.rb:328:in `say_with_time'
/usr/lib/ruby/1.8/active_record/migration.rb:348:in `method_missing'
./db/migrate//20101013020151_fix_contact_id_column.rb:3:in `up_without_benchmarks'
/usr/lib/ruby/1.8/active_record/migration.rb:282:in `send'
/usr/lib/ruby/1.8/active_record/migration.rb:282:in `migrate'
/usr/lib/ruby/1.8/benchmark.rb:293:in `measure'
/usr/lib/ruby/1.8/active_record/migration.rb:282:in `migrate'
/usr/lib/ruby/1.8/active_record/migration.rb:365:in `__send__'
/usr/lib/ruby/1.8/active_record/migration.rb:365:in `migrate'
/usr/lib/ruby/1.8/active_record/migration.rb:486:in `migrate'
/usr/lib/ruby/1.8/active_record/migration.rb:560:in `call'
/usr/lib/ruby/1.8/active_record/migration.rb:560:in `ddl_transaction'
/usr/lib/ruby/1.8/active_record/connection_adapters/abstract/database_statements.rb:136:in `transaction'
/usr/lib/ruby/1.8/active_record/transactions.rb:182:in `transaction'
/usr/lib/ruby/1.8/active_record/migration.rb:560:in `ddl_transaction'
/usr/lib/ruby/1.8/active_record/migration.rb:485:in `migrate'
/usr/lib/ruby/1.8/active_record/migration.rb:472:in `each'
/usr/lib/ruby/1.8/active_record/migration.rb:472:in `migrate'
/usr/lib/ruby/1.8/active_record/migration.rb:400:in `up'
/usr/lib/ruby/1.8/active_record/migration.rb:383:in `migrate'
/home/brad/www/contactly/vendor/rails/railties/lib/tasks/databases.rake:116
/usr/lib/ruby/1.8/rake.rb:636:in `call'
/usr/lib/ruby/1.8/rake.rb:636:in `execute
/usr/lib/ruby/1.8/rake.rb:631:in `each'
/usr/lib/ruby/1.8/rake.rb:631:in `execute'
/usr/lib/ruby/1.8/rake.rb:597:in `invoke_with_call_chain'
/usr/lib/ruby/1.8/monitor.rb:242:in `synchronize'
/usr/lib/ruby/1.8/rake.rb:590:in `invoke_with_call_chain'
/usr/lib/ruby/1.8/rake.rb:583:in `invoke'
/usr/lib/ruby/1.8/rake.rb:2051:in `invoke_task'
/usr/lib/ruby/1.8/rake.rb:2029:in `top_level'
/usr/lib/ruby/1.8/rake.rb:2029:in `each'
/usr/lib/ruby/1.8/rake.rb:2029:in `top_level'
/usr/lib/ruby/1.8/rake.rb:2068:in `standard_exception_handling'
/usr/lib/ruby/1.8/rake.rb:2023:in `top_level'
/usr/lib/ruby/1.8/rake.rb:2001:in `run'
/usr/lib/ruby/1.8/rake.rb:2068:in `standard_exception_handling'
/usr/lib/ruby/1.8/rake.rb:1998:in `run'
/usr/bin/rake:28

Есть идеи?Я был бы рад предоставить дополнительную информацию ...

Обновление: Было предложено попытаться откатить мою предыдущую миграцию ... но я получаю аналогичные результаты.

-rw-r--r-- 1 brad brad  166 2010-10-12 17:21 20101013002111_add_notes_to_call.rb
-rw-r--r-- 1 brad brad  175 2010-10-12 17:22 20101013002240_add_contact_to_call.rb
-rw-r--r-- 1 brad brad  146 2010-10-12 19:25 20101013020151_fix_contact_id_column.rb
brad@brad-vm:~/www/contactly/db/migrate$ rake db:migrate VERSION=20101013002111
(in /home/brad/www/contactly)
==  AddContactToCall: reverting ===============================================
-- remove_column(:calls, :contact)
rake aborted!
An error has occurred, this and all later migrations canceled:

undefined method `to_sym' for nil:NilClass

(See full trace by running task with --trace)

Ответы [ 2 ]

1 голос
/ 17 февраля 2012

Хотя эта проблема должна быть исправлена ​​в schema_definitions.rb, вы можете избавиться от этой ошибки, создав to_sym метод экземпляра для NilClass.

Создайте инициализатор в вашем приложении rails под config/initializers/nil_class.rb и добавьте в него следующее:

class NilClass
  def to_sym
    nil
  end
end

После того, как вы это сделаете, попробуйте снова запустить миграцию.

0 голосов
/ 13 октября 2010

Пожалуйста, опубликуйте исходную миграцию.

Если ваша миграция еще не запущена, просто отредактируйте исходную миграцию в соответствии с вашими потребностями и запустите:

rake db:migrate VERSION=<migration_date>
rake db:migrate 

дата миграции - это временная метка в имени файла миграции. Помните также, что вы должны выбрать миграцию до того, который вы планируете выполнить повторно, поэтому, если у вас есть:

201010101005_create_users.rb
201010101010_create_calls.rb

Вы хотите запустить:

rake db:migrate VERSION=201010101005
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...