3

假设,我有以下模型:

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

这是简单的活动-设备与加入模型(定位)的多对多关联。Targeting有许多相关的文档,我想在目标销毁时将其销毁。

在编辑页面上,有一个名为“ campaign[device_ids] ”的复选框集,我用它来选择当前广告系列的设备。

我已经添加device_idsCampaignattr_acessible,Rails 能够以某种方式管理CampaignsDevices之间的关联:它隐式地创建了Targeting模型。

但是,当我删除 Campaign 和 Device 之间的关联时,Targeting 模型被破坏,但与该 Targeting 关联的 Docs 不会被破坏。

例子:

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/updatedevice_ids = [2]我将拥有

Targetings:
  id: 2
  device_id: 2
  campaign_id: 1

但仍然

Docs:
  id: 1
  content: lalala
  targeting_id: 1

所以,Targetings[id=1] 被删除了,但是依赖的 Docs 没有被删除。

这是预期的行为吗?我应该手动更新关联吗?如果是这样,正确的方法是什么?

PS定位应始终隐式创建。

4

1 回答 1

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
于 2013-06-28T10:42:12.443 回答