Rails 应用程序:将默认数据添加到生产应用程序的最佳方式是什么

Rails app : What is the best way to add default datas to production application

我有一个用于生产的 Rails 6 应用程序。 当我升级我的应用程序时,我为新表 and/or 列添加了迁移。

如果我必须添加新的默认数据,最好的方法是什么?

我使用种子文件作为初始数据,但是是否有类似迁移(增量)的东西来添加数据?我知道我可以在迁移中添加数据,但我更喜欢另一个地方。

[编辑] 有人知道这个 gem : https://github.com/ilyakatz/data-migrate 吗? 它似乎满足了我的要求。

在一些项目中我们用来将数据更新放入db/data-updates/<UTC TimeStamp>_add_thing.rb。我们为这些创建了一个自己的生成器,由 rails generate data_update AddThing 调用以创建一个迁移,调用/执行相应更新文件中的内容。

基于此,您可以将这些默认数据放入 db/default-data 中,并使用与新默认值类似的逻辑。

您不需要通过迁移来调用它们,您也可以在不同的环境中 运行 它们作为 rails runner db/default-data/123_xyz.rb

但是如果新的默认值对于您的业务逻辑是强制性的,您应该让它们尽可能接近发明迁移!

如果有人正在寻找一个简单的解决方案,data_migrate 正是我想要的。

https://github.com/ilyakatz/data-migrate

数据迁移存储在 db/data 中。 数据迁移包含在模式迁移工作流中,使用简单的命令:

rails db:migrate:with_data

如果你能读懂西班牙语,这是一份关于 data_migrate 的有趣文档:https://la-guia.platan.us/stack/ruby/rails/data_migrate

如果可能,您应该避免在数据迁移中使用 ActiveRecord 模型。模型可能会发生变化,例如,如果您添加了验证,则您的数据迁移可能无法通过。

这里有很好的解释:https://medium.com/@jeffcoh23/why-you-should-avoid-activerecord-when-using-ruby-on-rails-data-migrate-gem-2651739395d9

一个好的解决方案是调用专为数据迁移创建的模型:

class AddVisitorRoleToUsers < ActiveRecord::Migration[6.0]
  class MigrationUser < ApplicationRecord
    self.table_name = :users
  end
  
  def up
    MigrationUser.all.each do |user|
      user.update!(role: 'visitor')
      # This will NOT call User model validations
    end
  end

  def down
    raise ActiveRecord::IrreversibleMigration
  end
end