在Migration中操作新添加的字段

本文介绍如何在Rails迁移中正确更新数据库字段,特别是当需要将现有字段拆分为两个新字段时的操作流程。通过重新加载Model确保数据能正确迁移。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在Migration中操作新添加的字段

在有些情况下,我们需要在某个migration中对新增加的字段进行操作,比如下面这个将name改成first_name和last_name的migration:


def self.up
  add_column :profiles, :last_name, :string
  add_column :profiles, :first_name, :string
  Profile.find(:all).each do |profile|
    profile.first_name = profile.name
    profile.save(false)
  end
  remove_column :profiles, :name
end

这段代码看起来没什么问题,但是如果你真的这么做,那就惨了,你数据库中所有用户的名字信息都会丢失,而不会如你所愿的保存到first_name中,这是因为,当你为profiles表添加first_name字段时,Profile model已经完成了初始化,因此在它的columns里面是不存在first_name的,自己它也就不会被保存到数据库中,因此,要使上面这段代码工作正常,你需要在修改数据库后重新加载Profile model:


def self.up
  add_column :profiles, :last_name, :string
  add_column :profiles, :first_name, :string
  Profile.remove_class(Profile)
  load('profile.rb')
  Profile.find(:all).each do |profile|
    profile.first_name = profile.name
    profile.save(false)
  end
  remove_column :profiles, :name
end

现在,name就可以被正确的迁移到first_name字段中了,这个方法也可以用于在Console中重新加载某个过期的model。

来源:www.letrails.cn

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值