我为一家非营利组织编写了一个rails程序来帮助跟踪遭遇。最初的想法是,一次遭遇可能会提供多个服务,因此设置为:
class Encounter < ApplicationRecord
has_many :encounters_services, dependent: :destroy, inverse_of: :encounter
has_many :services, through: :encounters_services
accepts_nested_attributes_for :encounters_services
class Service < ApplicationRecord
has_many :encounters, :through => :encounters_services
has_many :encounters_services, dependent: :destroy, inverse_of: :service
最终用户现在已经发现,他们只想将一个服务与一次遭遇联系起来。但是在原始结构下的数据库中已经有很多数据了。有没有一种干净的方法可以将其转换为一个服务"有很多"邂逅,而一个邂逅"属于"一个服务的场景,而不会弄乱"邂逅服务"表中数据库中已经存储的数据?
谢谢!我还是个新手,所以我很感激你的帮助!
我想您可以添加一个新的迁移来向服务添加一个新列,并添加一个小脚本来设置EncountersServices的值。
类似的东西
def change
add_column :services, :encounter_id, :integer, index: true
Service.each do |s|
s.update_column :encounter_id, s.encounters.first.id
end
end
您可以不更改以前的数据。由于旧关联的数据有自己的表,所以模型的表不会有垃圾。
编辑:我错误地理解了这种关系,如果一次遭遇应该属于某个服务,那么迁移会是这样的:
def change
add_column :encounters, :service_id, :integer, index: true
Encounter.each do |e|
e.update_column :service_id, e.services.first.id
end
end