Правильный способ сброса зависимых ассоциаций перед уничтожением записи? - PullRequest
0 голосов
/ 04 мая 2020

Скажем, у меня есть 2 модели ActiveRecord - Team и Player, с простыми отношениями родитель / потомок

class Team < ApplicationRecord
  has_many :players
end

class Player < ApplicationRecord
  belongs_to :team
end

В Rails предусмотрены такие параметры, как dependent: :destroy, чтобы указать, что происходит с дочерними ассоциациями когда родитель уничтожен.

Но что, если я не обязательно хочу уничтожить Player s, когда я destroy a Team? Вместо этого я хотел бы сбросить поле team_id на каждом Player, а затем безопасно destroy Team.

Есть ли для этого наилучший практический подход?

Моя мысль была -

  1. Определить before_destroy хук Team, который очищает Player#team_id у его различных игроков

  2. Определите after_rollback крючок для Team, который обрабатывает случай, когда что-то нужно было откатить. Это повторно добавит team_id ко всем Player моделям, в основном полностью изменив то, что мы только что сделали

Нужен ли № 2? Или ручка отката обращает вспять то, что я уже сделал? И в целом это лучший способ подойти к этому?

Было бы интересно услышать, если у кого-то есть более простой подход.

Спасибо!

1 Ответ

2 голосов
/ 04 мая 2020
class Team < ApplicationRecord
  has_many :players, dependent: :nullify
end

class Player < ApplicationRecord
  belongs_to :team, optional: true
end

См. опции для зависимой опции .

...