Ассоциации уведомлений - как это правильно делать?

У меня есть приложение Rails 3.2 с пользовательской моделью. Я хочу добавить механизм уведомлений, который может запускаться в следующих случаях использования:

  • Нравится чей-то профиль
  • Комментирование чьего-либо профиля
  • Следуя за кем-то

Во всех случаях один пользователь генерирует уведомление своим поведением, которое получит другой пользователь. Итак, есть отправитель и получатель уведомлений.

Сейчас я размышляю, как структурировать свои ассоциации. Пока что мои модели выглядят так:

Notification.rb

attr_accessible :content, :read_at, :recipient_id, :sender_id

belongs_to :sender,     class: :user
belongs_to :recipient,  class: :user

User.rb

has_many :notifications, as: :recipient, dependent: :destroy, foreign_key: :recipient_id
has_many :notifications, as: :sender, dependent: :destroy, foreign_key: :sender_id

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

Итак, мои вопросы:

  • Как бы вы отрегулировали вышеуказанные ассоциации?
  • Как бы вы их назвали?
  • Как я смогу вызывать все отправленные уведомления и все полученные уведомления на модели пользователя без необходимости писать области?
  • Это вообще правильный подход, или я должен использовать таблицу соединений где-то два, чтобы не ссылаться на пользователя дважды?

Спасибо!

Решение

Чтобы выразить решение Шейна словами, вот как должны выглядеть модели. Это было действительно намного проще, чем я думал. Я предполагал, что мне придется здесь творить чудеса, но Rails снова обманул меня своей потрясающей простотой! Ну вот почему мне это так нравится.

Большое спасибо, Шейн!

Notification.rb

attr_accessible :content, :read_at, :recipient, :recipient_id, :sender, :sender_id

belongs_to :sender, class_name: "User"
belongs_to :recipient, class_name: "User"

User.rb

has_many :received_notifications, class_name: "Notification", foreign_key: "recipient_id", dependent: :destroy
has_many :sent_notifications, class_name: "Notification", foreign_key: "sender_id", dependent: :destroy

person weltschmerz    schedule 01.02.2013    source источник
comment
Отношения, которые вы выразили выше, являются нормой для такого типа отношений. Нет ничего плохого в наличии нескольких отображений в модели, использующих один и тот же класс.   -  person ilan berci    schedule 01.02.2013


Ответы (1)


Это совершенно нормально. Вот пример того же шаблона, который используется в Redmine, популярном приложении с открытым исходным кодом:

https://github.com/edavis10/redmine/blob/master/app/models/workflow_rule.rb#L23-L24

Что касается необходимости в методе, который получает как отправленные, так и полученные уведомления, ответ здесь хорошо подходит для основных нужд.

Модель Rails has_many с несколькими foreign_keys

person Shane    schedule 01.02.2013