我有一个在生产中使用的Rails 6应用程序。当我升级我的应用程序时,我会为新的表和/或列添加迁移。
如果我必须添加新的默认数据,最好的方法是什么?
我使用种子文件作为初始数据,但是否有类似迁移(增量(的东西来添加数据?我知道我可以在迁移中添加数据,但我更喜欢其他地方。
[EDIT]有人知道这个宝石吗: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-void-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