【问题标题】:How to change structure of existing columns, based on old values during migration?如何在迁移期间根据旧值更改现有列的结构?
【发布时间】:2019-01-29 10:15:11
【问题描述】:

在开发过程中,列的结构发生了变化,因此在生产中需要将旧用户数据采用新格式。看起来可以通过迁移解决的问题。问题是,我不是一位经验丰富的 ruby​​ 专家,所以如果有如何实施它的建议会很棒。

为了清楚起见,我将举例说明我的项目中发生的事情。

有表users。此表包含下一列,

  • id

  • user_type

  • 说明

description 这里只是 JSON 字符串,看起来像旧实现中的那样,

  • 名字

  • 姓氏

  • 地址

更改后,full_name 不再是 first_namelast_name,仅适用于类型为“客户”的用户。

那么,如何将旧数据迁移到新格式?谢谢。

【问题讨论】:

  • description 的数据类型是什么?提供架构,您使用哪个版本的 Rails?
  • 您的数据类型可能是json 或序列化为哈希的字符串
  • @ray 这是一个 json。
  • 而 ruby​​ 版本是 2.6.0。
  • 你也可以通过rake直接更新值!提供答案或您可以通过控制台运行代码

标签: ruby-on-rails database-migration


【解决方案1】:

您的相应型号User 必须具有以下功能,

serialize :description, Hash

尝试在下面的路径中写rake,

lib/tasks/update_users.rake

namespace :update_users do

  desc 'Update description for full name for all user'

  task update_description: :environment do
    User.all.each do |user|
      user.description[:full_name] = user.description.delete(:first_name) + ' ' + user.description.delete(:last_name)
      user.save(validate: false)
    end
  end

end

然后运行 ​​rake,rake update_users:update_description

也许你可以通过 rails 控制台运行代码,

User.all.each do |user|
  user.description[:full_name] = user.description.delete(:first_name) + ' ' + user.description.delete(:last_name)
  user.save(validate: false)
end

【讨论】:

  • 我几乎完成了这个,但在迁移而不是任务中。我的问题很简单——我不知道我可以在迁移脚本中调用模型。在文档中,我阅读了诸如 change_table 之类的方法,并认为这是进行迁移的正确方法。看到你的回答,我明白了,以所需的方式选择和转换数据并不难。
猜你喜欢
  • 2023-03-31
  • 2017-06-26
  • 2021-09-01
  • 2015-05-18
  • 2016-01-11
  • 2015-06-15
  • 1970-01-01
  • 2019-07-14
  • 2018-03-22
相关资源
最近更新 更多