#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)