Это просто, есть два вида операций в AR миграции:
1) Rails автоматически знает, как откатить (вернуться) эти операции в миграции, например:
def change
add_column :users, :age, :integer
end
миграция означает, что добавить столбец возраст, средство отката удалить столбец возраст. Или create_table, обратная операция drop_table. Эти операции можно поместить в изменение метод миграции и рельсы знает, что делать при откате/обратном переносе.
2) Rails должен помочь, как обрабатывать миграцию и Откат процесс, как правило, это операции, которые каким-то образом модифицирует данные.
def self.up
add_column :users, :name, :string
add_column :users, :surname, :string
say_with_time 'Split username into name and surname' do
Users.select(:username).all.each do |user|
user.name = user.username.split(/ /)[0]
user.surname = user.username.split(/ /)[1]
user.save!
end
end
remove_column :users, :username
end
Как вы можете видеть, эта операция довольно сложная. Rails не знает, как изменить эту операцию, так что вы должны написать обратный код операции в self.down:
def self.down
add_column :users, :username, :string
say_with_time 'Join name and surname into username' do
User.all.each do |user|
user.update_attributes(username: "#{user.name} #{user.surname}")
end
end
remove_column :users, :name
remove_column :users, :surname
end
и то все ...
Спасибо так много! –
Добро пожаловать :-) –