При миграции: неопределенный метод `to_sym 'для nil: NilClass - PullRequest
15 голосов
/ 08 января 2011

Я использую Rails 3.0.3, и я случайно сделал опечатку в своей миграции: я создал миграцию, которая создает новый столбец с типом boolen (это должно было быть boolean).Я запустил миграцию, и Rails не предупредил меня, что это недопустимый тип столбца, что я мог поклясться, что он делал в предыдущих версиях?

Теперь, когда я пытаюсь что-то добавить, удалить или изменить вПри миграции я получаю следующую ошибку:

неопределенный метод `to_sym 'для nil: NilClass

Я не могу даже выполнить откат или сброс.У меня сохранена более ранняя версия базы данных и дерева файлов, но эта проблема сводит меня с ума, потому что я не первый раз вижу, как это происходит.

Как эффективно удалить столбец, не имеяRails жалуются (и желательно без копания в базе данных вручную)?

Ответы [ 9 ]

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

Если вы используете базу данных SQLite, вы, вероятно, получаете эту ошибку, потому что SQLLite не предоставляет функцию удаления столбца.http://www.sqlite.org/faq.html#q11

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

9 голосов
/ 02 сентября 2011

Как вы упомянули в своих комментариях к codeglot, когда запись в вашей базе данных, вы все равно получите ошибку при попытке удалить столбец.

 :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

надеюсь, это поможет

6 голосов
/ 08 января 2011

Это проблема, с которой я столкнулся при миграции рельсов.Вы ошиблись или ошибочно указали поле с его названием.Вот что вы можете сделать.

  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, то выполните новую миграцию, удалите таблицу с сообщением о проблеме и выполните регенерацию.Я должен был сделать это раньше.Просто убедитесь, что вы правильно сделали свой заказ.

4 голосов
/ 03 ноября 2011

Вы также можете исправить базу данных с помощью инструмента базы данных.У меня была такая же проблема и я использовал отличное приложение «База» для MacOS X. Оно позволяет менять тип поля базы данных sqlite.

В фоновом режиме он просто создает новую таблицу с измененными полями и копирует данные из исходной.Работал на меня!

3 голосов
/ 02 марта 2014

У меня была почти точно такая же проблема (с ошибкой bolean), и я не мог заставить работать rake db:rollback, не выбрасывая имя столбца (из-за SQLite3), используя Rails 4.0.2.

Поскольку мне было все равно, если данные БД были удалены, вот как я это исправил:

  1. Удалить всю базу данных rake db:drop
  2. Редактировать[timestamp]_migration_name.rb файл, чтобы правильно сказать boolean
  3. Создайте базу данных снова rake db:create
  4. Перенос данных rake db:migrate
  5. (Перезапустите веб-сервер и т. Д.!)
1 голос
/ 01 ноября 2013

Я получил похожую ошибку, когда пытался создать таблицу соединений в 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, и он успешно мигрировал.

Я знаю, что это точно не относится к вашему вопросу.Но если у кого-то возникла эта проблема, уверен, что он найдет эту ветку.

1 голос
/ 14 декабря 2011

Если при повторном откате вы столкнулись с той же проблемой, попробуйте вручную удалить неисправный столбец в базе данных.(Есть хороший плагин Firefox под названием SQLite Manager.)

Затем выполните команду отката, исправьте проблему в файле миграции и, наконец, выполните миграцию снова.Это поможет вам оставаться в условиях миграции Rails.

0 голосов
/ 15 апреля 2017

У меня была такая же проблема, потому что вместо этого "$ rails генерирует миграцию add_reset_to_users reset_digest: string \

reset_sent_at: datetime" Я пропустил типизированный "$ rails генерирует миграцию add_reset_to_users reset_digest: string \ reset_sent_at: datetime».Сначала я удалил миграцию «сброса» с помощью браузера БД для SQLite, затем я проверил файл schema.rb, в котором вместо «t.string» reset_digest »« было «t.» Reset_digest »».Я отредактировал его до "t.string", затем rails db: migrate VERSION = "previous one", и это сработало.Сейчас моя последняя миграция не работает.Я удалил свой предыдущий файл миграции, а затем выполнил «$ rails генерировать миграцию add_reset_to_users reset_digest: string reset_sent_at: datetime», я получил файл миграции, как я хотел сейчас.

0 голосов
/ 08 сентября 2016

Ошибка:

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 только для тестирования и разработки, где удаление базы данных и ее восстановление с нуля является обычной операцией. Мы используем другую базу данных, которая не имеет этой проблемы в производственной среде, поэтому изменение старой миграции мне подходит.

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