我有两个表 talks
和 media
。
演讲
可能有 0 或 1 个媒体
。媒体
可以包含不与任何谈话
关联的其他行。
我计划将 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_one
和 belongs_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/