将"has many, through"关联转换为简单的"belongs to"关联



我为一家非营利组织编写了一个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

最新更新