ruby-on-rails - Rails 6 迁移在现有表之间添加外键关联

标签 ruby-on-rails associations database-migration ruby-on-rails-6

我有两个表 talksmedia

  1. 演讲可能有 0 或 1 个媒体
  2. 媒体可以包含不与任何谈话关联的其他行。

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

当前的迁移看起来像,它运行良好,并根据我的需要在 talks 表上生成 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 表中被引用。

免责声明:我对 Rails 还很陌生。谢谢。

最佳答案

由于您将外键放入talks中,这意味着talks属于媒体(因为它只能属于一个媒体(talks中的media_id列只能容纳一个媒体)值/一个 ID)。

在Rails指南中,您可以找到有关如何在belongs_to和has_one之间进行选择的更多信息,主要指标是您将外键放置在哪个表中。 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(如果您希望在删除通话时删除所有关联的媒体)。或者,您也可以先删除媒体,然后再删除通话。

关于ruby-on-rails - Rails 6 迁移在现有表之间添加外键关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64273064/

相关文章:

ruby-on-rails - 用于用户注册、密码恢复的 Rails 插件,行得通吗?

javascript - 替换 Rails 表单字段

mysql - 在 Sequelize 中填充没有关联 id 的数据

Windows 10 不断循环 "How do you want to open this file?"对话框

associations - Sequelize 关联

python - alembic:在迁移中使用子查询更新语句

mysql - rails : has_many through with multiple foreign keys?

javascript - Spine.js 中的 Controller 间通信

mysql - 站点迁移后建立数据库连接时出错?

mysql - 将印度语言数据从 SQL Server 迁移到 MySQL