2015-05-12 4 views
0

В Rails мне нужна модель с has_many с двумя внешними ключами, которые должны быть сопоставлены для составления списка.Несколько внешних ключей _ has_many

Ex:

Organization_Profiles

структура таблицы

id : int 
profile_id : int 
organization_id : int 

ассоциации

belongs_to: :profile 
belongs_to: :organization 
has_many: :notifications, foreign_keys: [:profile_id, :organization_id], dependent: :destroy 

Уведомления

таблица структуры

id : int 
profile_id : int 
organization_id : int 
level : int 
message : string 

ассоциации

belongs_to: :profile 
belongs_to: :organization 

Как я могу выполнить выше? Из того, что я исследовал, foreign_keys: [] не существует.

+0

Каков основной набор ассоциаций, в котором вы нуждаетесь? Давайте перестроим это, чтобы работать для ваших нужд. Композитные внешние ключи не идеальны в Rails, и обычно есть другое решение. –

+0

@JoeEssey Вышеупомянутые отношения мне нужны. Мне нужно иметь возможность зависания:: уничтожать уведомления, если организация удалена от пользователя (т. Е. Структура профиля уничтожена. – steventnorris

+0

Думаю, вам нужно будет добавить действие обратного вызова в «ProfileOrganizations», чтобы выполнить удаление. вам не нужно строить отношения, чтобы получить функциональность 'depend:: destroy'. Я не знаю полной модели вашего приложения, но мой инстинкт говорит, что есть что-то подозрительное, связанное с привязкой к таблице моста. –

ответ

0

Вы можете выполнить это, не полагаясь на команду ассоциации dependent. Лучший способ, который я могу придумать, - «очистить» ассоциации, когда предпринимается действие, чтобы отделить Profile от Organization. У вас может быть обратный метод в Organization.

class Profile < ActiveRecord:Base 

    def method_that_disassociates_from(inputted_organization) 
    self.organizations.delete(inputted_organization) 
    self.notifications.where(organization_id: inputted_organization.id).destroy_all 
    end 

end 
+0

Это работает, но только если я вызываю этот метод или использую маршрут, который вызывает этот метод. Если бы я удалил ProfileOrganization без использования этого метода/маршрута, ассоциации останутся. Я считаю, что размещение аналогичного кода в after_destroy на ProfileOrganization должно делать трюк. – steventnorris

+0

Я думал о том, чтобы положить after_destroy в этот класс. Я думаю, вы просто делаете запрос 'where (profile: profile, org: org) .delete_all'. Я не сделал этого, потому что я чувствую, что уведомления в основном принадлежат пользователям, и я несправедливо утверждаю, что это смещение на вас :). –

+0

Имеет смысл. Уведомления связаны с пользователем, но в этом случае они также связаны с организацией, которая представляет собой функциональность, которую предоставляет таблица соединений. Если вы отрегулируете свой ответ на аккаунт, я соглашусь. – steventnorris