轨。 ActiveRecord的::迁移。可逆

时间:2015-07-14 19:53:05

标签: ruby-on-rails database ruby-on-rails-4 activerecord rails-activerecord

我阅读了RoR指南,我不明白下一行:

  

如果您希望迁移执行Active Record不知道如何撤消的操作,可以使用可逆

这是什么意思“不知道如何扭转”?如何区分Active Record可以反转什么不可以反转?

1 个答案:

答案 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

并且那就是......