У меня есть приложение 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