如何在现有模型上从 add_reference rails 迁移中填充 ID
How to populate ids from add_reference rails migration on existing model
我有 4 个现有模型,例如 RegionA、RegionB、ProductA 和 ProductB 以及定义
class RegionA < ...
has_many :product_as
...
end
class ProductA < ...
belongs_to :region_a
...
end
class RegionB < ...
has_many :product_bs
...
end
class ProductB < ...
belongs_to :region_b
...
end
我可以通过 运行ning
生成的迁移来添加 productB 和 regionA 之间的关联
rails g migration AddProductAToRegionBs producta:references
但 ID 未填充到新列中。鉴于有数百万条记录,填充这些 ID 的最佳方式是什么,而不会在数小时内强制迁移到 运行?我可以从迁移中踢出一个 activejob,还是最好在部署后 运行 一个手动脚本?这里最好的方法是什么?
您如何期望 Rails 知道哪个产品 B 属于 RegionA 的哪个记录?如果您可以编程方式定义此行为,则可以执行以下操作:
ProductB.all.map { |p| p.region_a = region_a }
其中 region_a 是您找到的定义区域。这也可以放在您的迁移中。
我最终编写了一个脚本,该脚本 运行 相当于 sidekiq 中的迁移,首先在 运行 迁移之前填充关联。然后我在部署之前有一个准备好的数据库,t运行sition 很简单。
我有 4 个现有模型,例如 RegionA、RegionB、ProductA 和 ProductB 以及定义
class RegionA < ...
has_many :product_as
...
end
class ProductA < ...
belongs_to :region_a
...
end
class RegionB < ...
has_many :product_bs
...
end
class ProductB < ...
belongs_to :region_b
...
end
我可以通过 运行ning
生成的迁移来添加 productB 和 regionA 之间的关联rails g migration AddProductAToRegionBs producta:references
但 ID 未填充到新列中。鉴于有数百万条记录,填充这些 ID 的最佳方式是什么,而不会在数小时内强制迁移到 运行?我可以从迁移中踢出一个 activejob,还是最好在部署后 运行 一个手动脚本?这里最好的方法是什么?
您如何期望 Rails 知道哪个产品 B 属于 RegionA 的哪个记录?如果您可以编程方式定义此行为,则可以执行以下操作:
ProductB.all.map { |p| p.region_a = region_a }
其中 region_a 是您找到的定义区域。这也可以放在您的迁移中。
我最终编写了一个脚本,该脚本 运行 相当于 sidekiq 中的迁移,首先在 运行 迁移之前填充关联。然后我在部署之前有一个准备好的数据库,t运行sition 很简单。