让我们说,我有以下模型:
class Campaign < ActiveRecord::Base
has_many :targetings
has_many :devices, :through => :targetings
attr_accessible lalalala, :device_ids
end
class Device < ActiveRecord::Base
has_many :targetings
has_many :campaigns, :through => :targetings
end
class Targetings < ActiveRecord::Base
belongs_to :campaign
belongs_to :targeting
has_many :docs, :dependent => :destroy
end
class Doc < ActiveRecord::Base
belongs_to :targeting
end
简单广告系列 - 设备与加入模式(定位)的多对多关联。 定位有许多关联的文档,我希望在定位销毁时将其销毁。
在修改页面上有一个名为“广告系列[device_ids] ”的复选框,我用它来选择当前广告系列的设备。
我已将device_ids
添加到广告系列的attr_acessible
,并且Rails能够以某种方式管理广告系列与设备之间的关联:它隐式创建定位模型。
但是,当我删除Campaign和Device之间的关联时,目标模型会被销毁,但与该目标关联的文档不会被销毁。
示例:
Devices:
id: 1
title: A
----
id: 2
title: B
Campaigns:
id: 1
title: CA
Targetings:
id: 1
device_id: 1
campaign_id: 1
Docs:
id: 1
content: lalala
targeting_id: 1
这是初始状态。当我要求时:
POST campaign/1/update
,device_ids = [2]
我会
Targetings:
id: 2
device_id: 2
campaign_id: 1
但仍然
Docs:
id: 1
content: lalala
targeting_id: 1
因此,目标广告[id = 1]已被删除,但相关文档未被删除。
这是预期的行为吗?我应该手动更新关联吗?如果是这样,做正确的方法是什么?
P.S。应始终隐式创建定位。
答案 0 :(得分:3)
似乎(来自官方文档)
自动删除连接模型是直接的,没有销毁回调 触发。
乍一看并不是一个明显的决定 - 我认为这是出于性能原因而做出的。
但是,通过在设备关联上使用after_remove
挂钩,我能够解决上述问题:
has_many :devices, :through => :targetings, :before_remove => :destroy_targeting
def destroy_targeting(device)
Targeting.where(campaign_id: id, device_id: device.id).destroy_all
end