Rails 6 迁移添加现有表之间的外键关联
Rails 6 migration add foreign key association between existing tables
我有两个 tables talks
和 media
.
talks
可能有0个或1个media
。
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_one
和 belongs_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
,(如果您希望在删除呼叫时删除所有关联的媒体)。或者,您也可以先删除媒体,然后再调用。
我有两个 tables talks
和 media
.
talks
可能有0个或1个media
。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_one
和 belongs_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
,(如果您希望在删除呼叫时删除所有关联的媒体)。或者,您也可以先删除媒体,然后再调用。