Rails JOIN模型依赖destroy

时间:2013-06-24 13:06:01

标签: ruby-on-rails activerecord many-to-many associations

让我们说,我有以下模型:

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/updatedevice_ids = [2]我会

Targetings:
  id: 2
  device_id: 2
  campaign_id: 1

但仍然

Docs:
  id: 1
  content: lalala
  targeting_id: 1

因此,目标广告[id = 1]已被删除,但相关文档未被删除。

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

P.S。应始终隐式创建定位。

1 个答案:

答案 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