【问题标题】:Rails. ActiveRecord::Migration. Reversible导轨。 ActiveRecord::迁移。可逆
【发布时间】:2015-07-14 19:53:04
【问题描述】:

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

如果你希望迁移做一些 Active Record 不知道如何撤销的事情,你可以使用 reversible

“不知道如何反转”是什么意思?如何区分 Active Record 哪些可以反转,哪些不能?

【问题讨论】:

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


    【解决方案1】:

    很简单,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
    

    仅此而已……

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-24
      • 1970-01-01
      • 1970-01-01
      • 2014-06-07
      • 2018-11-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多