Почему прямое изменение файла переноса не приводит к изменению файла схемы?

#ruby-on-rails #ruby

#ruby-on-rails #ruby

Вопрос:

Мой текущий файл переноса

 class CreateMovies < ActiveRecord::Migration
  def up
    create_table :movies, :force => true do |t|
      t.string :title
      t.string :rating
      t.text :description
      t.datetime :release_date
      # Add fields that let Rails automatically keep track
      # of when movies are added or modified:
      t.timestamps
    end
  end

  def down
    drop_table :movies
  end
end
 

Я пытаюсь изменить тип release_date на integer . Поэтому я напрямую меняю файл на

 class CreateMovies < ActiveRecord::Migration
  def up
    create_table :movies, :force => true do |t|
      t.string :title
      t.string :rating
      t.text :description
      t.integer :release_date
      # Add fields that let Rails automatically keep track
      # of when movies are added or modified:
      t.timestamps
    end
  end

  def down
    drop_table :movies
  end
end
 

Пожалуйста, обратите внимание, изменен тип release_date . Но после того, как я запустил

bundle exec rake db: миграция

Он по-прежнему создает тот же файл схемы, что и раньше. Я так смущен.

Ответ №1:

Вероятно, это потому, что вы уже выполнили миграцию. Поэтому, прежде чем вы захотите его изменить, вы должны сначала откатить его:

 bundle exec rake db:rollback
 

затем вы должны изменить его и запустить снова:

 bundle exec rake db:migrate
 

Комментарии:

1. Именно тот ответ, который я хочу!

2. Предполагая, что это последний bundle exec rake db:migrate:redo , произойдет откат и повторная миграция последней миграции

Ответ №2:

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

 class ChangeMoviesReleaseTypeToInteger < ActiveRecord::Migration
  def up
    change_column :movies, :release_date, :integer
  end

  def down
    change_column :movies, :release_date, :datetime
  end
end
 

В качестве дополнительного примечания, release_date это запутанное имя для целочисленного поля — большинство людей ожидают, что это будет дата-время, как у вас изначально.

Ответ №3:

down приведет к удалению таблицы

rake db:migrate:down VERSION=имя_файла (исключить расширение)

up создаст новые изменения

 rake db:migrate:up VERSION=file_name(exclude extension)