将“有很多,通过”关联转换为简单的“属于”关联

时间:2018-11-04 12:46:41

标签: ruby-on-rails activerecord

我为一个非营利组织编写了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”表中数据库中已经存储的数据的情况?

谢谢!我仍然是新手,非常感谢您的帮助!

1 个答案:

答案 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