Rails 6 迁移添加现有表之间的外键关联

Rails 6 migration add foreign key association between existing tables

我有两个 tables talksmedia.

  1. talks可能有0个或1个media
  2. media 可以包含与任何 talks 无关的其他行。

我打算将 talks table 的外键添加到字段 media_id(引用 media),这样如果 media 被删除,media_id 将为空。虽然不是非常必要,但在删除 talks 行时删除关联的 media 会很棒,如果有的话。

当前的迁移看起来像,它运行良好并在 talks table 上生成 media_id,如我所愿:

class AddMediaToTalks < ActiveRecord::Migration[6.0]
  def change
    add_reference :talks, :media, type: :integer, foreign_key: true
  end
end

但是,我不太确定我需要在模型上放什么,我的意思是 has_onebelongs_to。我不确定哪个适用于哪个型号,或者即使我只需要一个或两者都不需要。

我也试过在迁移脚本中添加on_delete: :nullify,但实际上并没有任何效果。我正在使用 mysql,顺便说一句。当我尝试删除关联的 media 时,它失败了,因为它在 talks table.

中被引用

Disclaimer :我是 Rails 的新手。谢谢。

既然你把外键放到talks里面,就代表talks属于媒体(因为只能属于一个媒体(talks中的media_id栏只能放一个value/one id).

在 Rails 指南中,您可以找到有关如何在 belongs_to 和 has_one 之间进行选择的更多信息,主要指标是 table 您将外国钥匙。 https://guides.rubyonrails.org/association_basics.html#choosing-between-belongs-to-and-has-one(根据您的用例,您可能想说一个谈话有一个媒介(?)并再次改变它 - 但这也意味着改变迁移!)。

如果您想在删除谈话时删除媒体,只需将 dependent: :destroy 添加到谈话模型:

class Talk
  belongs_to :media, dependent: :destroy
end

对于这个问题:

When I try to delete associated media, it fails because it is referenced in the calls table.

这意味着您缺少 calls 模型中的 dependent: :destroy,(如果您希望在删除呼叫时删除所有关联的媒体)。或者,您也可以先删除媒体,然后再调用。