我为一个非营利组织编写了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
现在,最终用户已经发现他们只想将单个服务与遭遇相关联。但是,在原始结构下,数据库中已经有很多数据。是否有一种干净的方法可以将其转换为服务“具有许多”遇到且服务“属于”服务而又不会弄乱“ EncounterServices”表中数据库中已经存储的数据的情况?>
谢谢!我仍然是新手,非常感谢您的帮助!
答案 0 :(得分:1)
我想您可以添加一个新的迁移,以在服务中添加一个新列,并添加一个小脚本来设置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