С моделью Notification
как бы вы смоделировали отношение Отправитель / Актер, чтобы разрешить системные уведомления, где приложение является отправителем? т. е. «Ваш экспорт завершен» или «Ваша пробная версия подходит к концу».
Ниже приведено объяснение некоторых полей для вышеуказанной модели:
recipient_id
: представляет пользователь в вашем приложении, которое получит уведомление.
actor_id
: представляет пользователя в вашем приложении, которое вызвало уведомление.
read_at
: время, когда уведомление было прочитано. Значение nil используется для непрочитанных уведомлений.
notifiable_id
: объект, представляющий это уведомление (сообщение, комментарий и т. Д. c). Это будет полиморфная c ассоциация.
notifiable_type
: тип объекта, подлежащего уведомлению. Обычно это представляется гуманизированной (и, необязательно, интернационализированной) строковой формой класса объекта.
Моей первой мыслью было сделать Actor (способный) polymorphi c, но это не разрешить для DEFAULT_APPLICATION, который ссылается на приложение, потому что он не находится в базе данных и, следовательно, не ссылаться. Продолжая идею создания Actor polymorphi c, актер может быть @export
и current_user.subscription
соответственно. Третий вариант - смоделировать Notification
, чтобы учесть nil
Актера, и оставить актера nil
.
# Your export completed. Download your export.
# Your trial is ending soon. Update your payment information.
Notification.create(recipient: current_user, actor: ?, action: "completed", notifiable: @export)
Notification.create(recipient: current_user, actor: ?, action: "ending", notifiable: current_user.subscription)
# Polymorphic Actor
Notification.create(recipient: current_user, actor: @export, action: "completed", notifiable: @export)
Notification.create(recipient: current_user, actor: current_user.subscription, action: "ending", notifiable: current_user.subscription)
# nil
Notification.create(recipient: current_user, actor: nil, action: "completed", notifiable: @export)
Notification.create(recipient: current_user, actor: nil, action: "ending", notifiable: current_user.subscription)
.