我阅读了RoR指南,我不明白下一行:
如果您希望迁移执行Active Record不知道如何撤消的操作,可以使用可逆
这是什么意思“不知道如何扭转”?如何区分Active Record可以反转什么不可以反转?
答案 0 :(得分:1)
简单来说,AR迁移中有两种操作:
1)Rails自动知道如何在迁移中回滚(恢复)这些操作,例如:
def change
add_column :users, :age, :integer
end
迁移意味着添加列年龄,回滚意味着删除列年龄。或 create_table ,反向操作为 drop_table 。您可以在迁移中使用更改方法执行此操作,并且rails知道在回滚/撤消这些迁移时要执行的操作。
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
并且那就是......