преобразовать ассоциацию «имеет много через» в просто ассоциацию «принадлежит» - PullRequest
0 голосов
/ 04 ноября 2018

Я написал программу 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 голосов
/ 04 ноября 2018

Полагаю, вы могли бы добавить новую миграцию, чтобы добавить новый столбец к службам, и добавить небольшой скрипт для установки значения из 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...