Похоже, что в новой версии rails есть методы change по сравнению с методами self.up и self.down.
Итак, что происходит, когда нужно откатить миграцию, как узнать, какие действия нужно выполнить. У меня есть следующий метод, который мне нужно реализовать на основе онлайн-руководства:
class AddImageToUsers < ActiveRecord::Migration
def self.up
add_column :users, :image_file_name, :string
add_column :users, :image_content_type, :string
add_column :users, :image_file_size, :integer
add_column :users, :image_updated_at, :datetime
end
def self.down
remove_column :users, :image_file_name, :string
remove_column :users, :image_content_type, :string
remove_column :users, :image_file_size, :integer
remove_column :users, :image_updated_at, :datetime
end
end
Как я могу сделать то же самое, используя новый метод изменения?
ruby-on-rails
migration
бандиткороль
источник
источник
Ответы:
Для многих операций рельсы могут догадаться, что является обратной операцией (без проблем). Например, в вашем случае какова обратная операция
add_column
вызова при откате? Конечно жеremove_column
. Что обратноеcreate_table
? Этоdrop_table
. Таким образом, в этих случаях rails знают, как откатиться, и определитьdown
метод излишни (вы можете увидеть в документации методы, которые в настоящее время поддерживаются из метода изменения ).Но обратите внимание, потому что для какой-то операции вам все равно нужно определить
down
метод , например, если вы измените точность десятичного столбца, как угадать исходную точность при откате? Это невозможно, поэтому вам нужно определитьdown
метод.Как уже было сказано, я предлагаю вам прочитать Руководство по миграции Rails .
источник
Лучше использовать Up, Down, Change:
On Rails 3 (обратимый): который должен добавлять новый столбец вверх и заполнять все записи в таблице только вверх, и удалять этот столбец только внизу
def up add_column :users, :location, :string User.update_all(location: 'Minsk') end def down remove_column :users, :location end
Но:
Пришлось избегать использования метода изменения, который позволяет сэкономить время. Например, если вам не нужно обновлять значение столбца сразу после его добавления, вы сократите этот код до следующего вида:
def change add_column :users, :location, :string end
Вверху он добавит столбец в таблицу и удалит его вниз. Гораздо меньше кода и это прибыль.
On Rails 4: еще один полезный способ написать то, что нам нужно в одном месте:
def change add_column :users, :location, :string reversible do |direction| direction.up { User.update_all(location: 'Minsk') } end end
источник
ActiveRecord::IrreversibleMigration
.class AddImageToUsers < ActiveRecord::Migration def change add_column :users, :image_file_name, :string add_column :users, :image_content_type, :string add_column :users, :image_file_size, :integer add_column :users, :image_updated_at, :datetime end end
источник