Rails: я обновляю файл миграции, а затем запускаю db: migrate, но моя схема не обновляется
Я пытаюсь добавить дополнительное поле в одну из моих таблиц.
Я добавил поле в файл миграции (под db\migrate),
затем выполнил "rake db: migrate", который бежал без проблем. Мой текстовый редактор даже сказал мне, что мой файл schema.db обновлен и нуждается в обновлении.
Файл схемы не содержит мое новое поле, и любые попытки ссылаться на поле из моих представлений терпят неудачу.
Как мне это сделать? Можно ли обновить таблицу с дополнительным полем через рельсы без необходимости полностью откатывать и воссоздавать базу данных снова?
Ответы
Ответ 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!!