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


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

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

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, мой третий день на самом деле...)


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


Не знаю, применимо ли это, но стоит попробовать. Прямо из "гибкая разработка с Rails, 3-е издание":

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


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