2013-06-24 2 views
3

Скажем, у меня есть следующие модели:Рельсы JOIN в зависимости от модели уничтожить

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 

Это просто Кампании - Устройства многие-ко-многим ассоциации с присоединиться к модели (Targetings). Таргетинг имеет множество связанных документов, которые я хочу уничтожить при таргетинге на уничтожение.

На странице редактирования есть флажок с именем «campaign [device_ids]», который я использую для выбора устройств для текущей кампании.

Я добавил device_ids к кампания «s attr_acessible и Рельсы были в состоянии хоть как-то управлять связью между кампаниями и устройствами: она неявно создает Ориентацию модели.

Однако, когда я удаляю связь между кампанией и устройством, модель таргетинга уничтожается, но документы, связанные с этим таргетингом, не уничтожаются.

Пример:

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 

Итак, Targetings [ID = 1] был удален, но зависимые Docs не были удалены.

Ожидаемое поведение? Должен ли я вручную обновлять ассоциации? Если да, то каков правильный способ сделать это?

P.S. Таргетинг всегда должен создаваться неявно.

+1

Я не знаю, что это будет работать, но вы пробовали 'has_many кампании: targetings,: зависимый => : destroy'? Интересно, являются ли записи таблицы объединений по умолчанию 'deleted', а не' destroy', которые пропускают обратные вызовы (например, уничтожают другие зависимые записи). – gregates

+1

@gregates, к сожалению, это не повлияло: зависимые документы все еще не затронуты.Похоже, причина в том, что где-то в режиме управления рельсами. Я попробую переопределить метод device_ids = и вручную управлять связью. –

ответ

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 
Смежные вопросы