Rails: я обновляю файл миграции, затем запускаю db: migrate, но моя схема не обновляется
Я пытаюсь добавить дополнительное поле в одну из моих таблиц.
Я добавил поле в файл миграции (в разделе dbmigrate), затем запустил "rake db: migrate", который работал без проблем. Мой текстовый редактор даже рассказал мне мою схему.файл db обновлен и нуждается в обновлении.
файл схемы не содержит моего нового поля, и любые попытки ссылаться на поле из моих представлений терпят неудачу.
Как мне это сделать? Можно обновить таблицу с дополнительное поле через rails без необходимости полного удаления и повторного создания базы данных?
7 ответов
http://guides.rubyonrails.org/migrations.html#changing-existing-migrations
иногда вы делаете ошибку при написании миграции. Если вы уже запустили миграцию, вы не можете просто отредактировать миграцию и запустить миграцию снова: Rails думает, что он уже запустил миграцию, и поэтому ничего не будет делать при запуске rake db:migrate. Необходимо откатить миграцию (например, с помощью
rake db:rollback
), отредактируйте миграцию и запуститеrake db:migrate
для запуска исправленной версии.
вы всегда должны создавать новый файл миграции при добавлении / изменении чего-либо в базе данных. Такова цель миграций. Файл миграции должен иметь возможность вносить новые изменения и отменять изменения. Таким образом, если что-то не получается или вы передумали, вы можете легко вернуться к предыдущей миграции.
разделы следующей ссылки с надписью "Анатомия миграции" и "написание миграции" могут помочь вы.
решил мой собственный вопрос..
в основном вместо редактирования исходных файлов миграции, созданных при запуске лесов, вы создаете новый файл миграции только для того, что хотите получить:
http://guides.rubyonrails.org/migrations.html#creating-a-standalone-migration
Я сделал то же самое, я хотела изменить имя поля и вместо этого:
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
to
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) ==========================
и затем я загрузил свою страницу / контроллер с commenter_body вместо тела, и он загружен отлично.
Я думаю, что это также решение того же самого. Я не знаю,есть ли какие-либо проблемы в нижней работе в модели/DB( я все еще очень новичок в RoR, мой третий день на самом деле...)
Не знаю, применимо ли это, но стоит попробовать. Прямо из "гибкая разработка с Rails, 3-е издание":
Иногда эта таблица schema_migrations может вызвать проблемы. Например, если вы создадите
исходный файл миграции и запустите db:migrate
перед добавлением в файл инструкций, определяющих схему,
база данных будет думать, что она обновлена, а таблица schema info будет содержать новую версию
число.
если вы затем отредактируете это существующее файл миграции и запустите db:migrate
опять же, рельсы не знаю
применить новые изменения. В этих условиях часто проще всего отбросить базу данных, повторно создать
это, и повторите свою миграцию(ы).
Как только вы делаете rake db: migrate, то снова u не может добавить столбец в этот файл.Вы должны создать новый файл миграции с помощью rails G migration add_columnname_to_tablename для добавления этого конкретного столбца и сделать rake db:migrate.Вот так !!!