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

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

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

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

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

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

Ответы на вопрос(9)

Решение Вопроса

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

Если вы сделали только одну миграцию с момента возникновения проблемы.rake db:rollback.Это приведет вас к ошибке, и вы сможете изменить проблему, о которой я расскажу позже.Если это не последняя миграция, продолжайтеrake db:rollback пока вы там и проблема не будет устранена.

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

Например;

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

 Eric R.08 янв. 2011 г., 17:48
Даже падение вызывает ошибку. Миграция сейчас совершенно бесполезна.
 Eric R.08 янв. 2011 г., 16:55
Спасибо Сэм. К сожалению, "rake db: rollback" все еще дает мне to_sym bs. Это серьезно нужно исправить в Rails, это явная проблема -_-
 thenengah08 янв. 2011 г., 17:00
Затем бросьте свой стол и перенесите его снова. Надеюсь, у вас нет много данных :)
 Daniel08 янв. 2011 г., 19:23
Пожалуйста, опишите полностью ваше окружение
 thenengah08 янв. 2011 г., 16:59
да, это действительно хромает

Ошибка:

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

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

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

 Marina Martin25 мар. 2014 г., 07:13
Вы, сэр, сэкономили мне часы разочарования этим вечером. Спасибо.
 Marina Martin01 янв. 2016 г., 23:50
Два года спустя снова возникла та же проблема, снова на этой странице, снова сохранено! Спасибо!

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

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

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

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

 J Edward Ellis09 июл. 2015 г., 21:07
Хотя SQLite не допускает «ALTER TABLE table_name DROP COLUMN имя-столбца», это не означает, что вы не можете использовать миграцию remove_column. Rails должен реализовывать метод временных таблиц под крышками. У меня есть большая серия миграций, в которых я удаляю столбцы десять раз. Я пришел к этому вопросу, потому что получил указанное сообщение об ошибке только при десятом удалении.
 J Edward Ellis08 сент. 2016 г., 18:50
Изучите файл schema.rb для рассматриваемой таблицы. Я нашел:# Could not dump table "simulation_results" because of following StandardError # Unknown type 'real' for column 'elevator_kbtu_site' Я изменил real на float в более ранней миграции и исправил проблему.
 Grant Birchmeier09 нояб. 2012 г., 00:14
А, ты не можешь бросить колонку? Что за ... серьезно? Ergh. Спасибо за внимание.
 J Edward Ellis09 июл. 2015 г., 21:31
Да, я изучил код rails, и адаптер SQLite реализует метод временной таблицы. Вы получаете эту ошибку, потому что метод создания таблицы находит определение столбца с нулевым типом. Это может быть ошибка рельсов.

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

 :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

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

 Spundun26 авг. 2014 г., 21:51
Я пробовалgist.github.com/spundun/ade33d22ef71bfb61d7d Я все еще получаюundefined method `to_sym' for nil:NilClass<path to my rvm>/gems/ruby-2.1.1/gems/activerecord-4.1.0.rc1/lib/active_record/connection_adapters/abstract/schema_definitions.rb:216:in `column'

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

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

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

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

Удалить всю базу данныхrake db:dropИзменить[timestamp]_migration_name.rb файл, чтобы правильно сказатьbooleanСоздайте базу данных сноваrake db:createПеренос данныхrake db:migrate(Перезапустите веб-сервер и так далее!)

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

При миграции: неопределенный метод `to_sym 'для nil: Nil

Ваш ответ на вопрос