在销毁记录之前取消设置相关关联的正确方法?

Correct way to unset dependent associations before destroying a record?

假设我有 2 个 ActiveRecord 模型 - TeamPlayer,具有简单的 parent/child 关系

class Team < ApplicationRecord
  has_many :players
end

class Player < ApplicationRecord
  belongs_to :team
end

Rails 提供类似 dependent: :destroy 的选项来指定当父级被销毁时子关联会发生什么。

但是,如果我在 destroy 一个 Team 时不一定要销毁 Player 怎么办?相反,我想取消每个 Player 上的 team_id 字段,然后安全地 destroy Team.

是否有最佳实践方法?

我的想法是 -

  1. Team 上定义一个 before_destroy 挂钩,清除 Player#team_id 上的各种玩家

  2. Team 上定义一个 after_rollback 钩子来处理必须回滚的情况。这将 重新添加 team_id 到所有 Player 模型,基本上颠倒了我们刚刚所做的

#2 有必要吗?还是回滚处理逆转我已经做过的事情?总的来说,这是解决这个问题的最佳方式吗?

很想知道是否有人有更简单的方法。

谢谢!

class Team < ApplicationRecord
  has_many :players, dependent: :nullify
end

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

参见options for the dependent option