Подтвердить что ты не робот

Rails: я обновляю файл миграции, а затем запускаю db: migrate, но моя схема не обновляется

Я пытаюсь добавить дополнительное поле в одну из моих таблиц.

Я добавил поле в файл миграции (под db\migrate), затем выполнил "rake db: migrate", который бежал без проблем. Мой текстовый редактор даже сказал мне, что мой файл schema.db обновлен и нуждается в обновлении.

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

Как мне это сделать? Можно ли обновить таблицу с дополнительным полем через рельсы без необходимости полностью откатывать и воссоздавать базу данных снова?

4b9b3361

Ответ 1

http://guides.rubyonrails.org/migrations.html#changing-existing-migrations

Иногда вы совершаете ошибку при записи миграции. Если вы уже выполнили миграцию, вы не можете просто изменить перенос и снова выполнить миграцию: Rails считает, что он уже выполнил миграцию, и ничего не сделает при запуске rake db: migrate. Вы должны отменить миграцию (например, с помощью rake db:rollback), отредактировать перенос, а затем запустить rake db:migrate для запуска исправленной версии.

Ответ 2

Решил мой собственный вопрос..

В основном вместо редактирования исходных файлов миграции, сгенерированных при запуске леса, вы создаете новый файл миграции только для того, что вы хотите добиться:

http://guides.rubyonrails.org/migrations.html#creating-a-standalone-migration

Ответ 3

Вы всегда должны создавать новый файл миграции при добавлении/изменении чего-либо в базе данных. Это и есть цель миграции. Файл миграции должен иметь возможность сделать новое изменение и отменить изменение. Таким образом, если что-то пойдет не так, или вы изменили свое мнение, вы можете легко вернуться к предыдущей миграции.

Следующие ссылки, помеченные как "Анатомия миграции" и "Написание миграции", могут вам помочь.

http://guides.rubyonrails.org/migrations.html

Ответ 4

Я сделал то же самое, я хотел изменить имя поля и вместо этого:

class CreateComments < ActiveRecord::Migration
  def change
    create_table :comments do |t|
      t.string :commenter
      t.text :body

      # this line adds an integer column called `article_id`.
      t.references :article, index: true

      t.timestamps
    end
  end
end

Я изменил

  t.text :body

к

t.text :comment_body

Я попытался сделать рейк

db:migrate

ничего не произошло, так как в нем снова появилось командное приглашение без вывода..., я посмотрел на переполнение стека и > это заставило меня делать рейк

db:migrate:redo

с выводом

== 20141129044056 CreateComments: reverting ===================================
-- drop_table(:comments)
   -> 0.0000s
== 20141129044056 CreateComments: reverted (0.0886s) ==========================

== 20141129044056 CreateComments: migrating ===================================
-- create_table(:comments)
   -> 0.0040s
== 20141129044056 CreateComments: migrated (0.0040s) ==========================

а затем я загрузил свою страницу/контроллер комментатором_body вместо тела, и он загрузился отлично.

Я думаю, что это тоже решение. Я не знаю, есть ли какие-либо проблемы в нижней части работы в модели /DB (я все еще очень новичок в RoR, мой третий день на самом деле...)

Ответ 5

Мне удалось восстановить мою схему с помощью последних миграций, запустив rake db:schema:dump

Ответ 6

Не знаю, применимо ли это, но это стоит того. Прямо от "Agile Development with Rails, 3-е издание":

Иногда эта таблица schema_migrations может вызвать проблемы. Например, если вы создаете файл источника миграции и запустите db:migrate, прежде чем добавлять в файл какие-либо инструкции, определяющие схему, база данных будет считать, что она обновлена, а в информационной таблице схемы будет содержаться новая версия номер.
Если вы затем отредактируете этот существующий файл миграции и запустите db:migrate снова, Rails не будет знать примените ваши новые изменения. В этих обстоятельствах его часто проще всего отбрасывать, воссоздавать и перезапустите вашу миграцию.

Ответ 7

Как только вы сделаете rake db: переместите затем снова u не можете добавить столбец в этот файл. Вы должны создать новый файл миграции, используя rails g migration add_columnname_to_tablename для добавления этого конкретного столбца и сделать rake db: migrate.That it!!