【发布时间】:2015-07-14 19:53:04
【问题描述】:
我阅读了 RoR 指南,但我不明白下一行:
如果你希望迁移做一些 Active Record 不知道如何撤销的事情,你可以使用 reversible
“不知道如何反转”是什么意思?如何区分 Active Record 哪些可以反转,哪些不能?
【问题讨论】:
标签: ruby-on-rails database ruby-on-rails-4 activerecord rails-activerecord
我阅读了 RoR 指南,但我不明白下一行:
如果你希望迁移做一些 Active Record 不知道如何撤销的事情,你可以使用 reversible
“不知道如何反转”是什么意思?如何区分 Active Record 哪些可以反转,哪些不能?
【问题讨论】:
标签: ruby-on-rails database ruby-on-rails-4 activerecord rails-activerecord
很简单,AR迁移有两种操作:
1) Rails 自动知道如何在迁移中回滚(还原)这些操作,例如:
def change
add_column :users, :age, :integer
end
迁移表示添加列age,回滚表示删除列age。或者create_table,反向操作是drop_table。您可以将此操作放入迁移中的 change 方法中,并且 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
仅此而已……
【讨论】: