2013-11-20 4 views
0

Мы строим интранет в Ruby on Rails, и теперь мы хотим добавить функциональность для напоминаний, когда вы должны что-то сделать, но не сделали этого.Создание напоминаний/уведомлений в Rails

Например, у вас есть модель, Встреча, я хочу отправлять напоминания всем, кто имел встречу, но где отчет собрания пуст (meeting.date < Date.today && meeting.report == ""). И модель проекта, где у вас есть другие критерии (возможно, project.last_report.date < lastMonday && !project.closed)

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

Моей второй идеей является создание отдельного модуля, который на каждой загрузке страницы извлекает все записи, которые могут быть связаны, и выполняет все эти проверки, а затем возвращает напоминания, однако это, вероятно, будет медленным, чтобы попасть в базы данных. (Возможно, кеширование будет вариантом, но все же)

Итак, кто-нибудь сделал что-то подобное и получил какие-либо идеи о том, как решить нашу проблему?

Спасибо!

ответ

1

Я не вижу никаких проблем с кодом спагетти, если вы позволяете каждому объекту, которому требуется напоминание, управлять своими напоминаниями. Если вы хотите быть пуристом ООП, вы могли бы создать отдельный класс (например, MeetingReminderManager в вашем примере), чтобы управлять напоминаниями, но это похоже на излишнюю ситуацию. Рассмотреть ...

class Reminder 
    belongs_to :source, polymorphic: true 
    belongs_to :user 
end 

class Meeting 
    has_many :reminders, as: :source 
    has_many :users 

    after_create :build_reminders, if: ->{|meeting| meeting.report.blank? } 
    after_update :destroy_reminders, if: ->{|meeting| !meeting.report.blank? } 

    private 
    def build_reminders 
     users.each{|user| self.reminders.create user_id: user.id, due_on: self.date } 
    end 

    def destroy_reminders 
     self.reminders.delete_all 
    end 
end 
+0

Хорошо, так что 1 потенциальная проблема здесь была бы в том, что мне нужна встреча, чтобы иметь напоминание только после того, как собрание прошло. Таким образом, для создания всех новых напоминаний все равно потребуется какая-то огромная задача рейка. –

+0

Альтернативный внешний вид: немедленно создайте напоминания (как показано на рисунке) и только отобразите/предпримите действия над напоминаниями, когда дата «due_on» (или due_at time) прошла. Обратите внимание, что приведенный код также удаляет напоминания, когда их требования были выполнены, чтобы пользователь не увидел напоминание, если они своевременно выполнили требования. Это намного проще. – AndyV

+0

думаю. Вы также можете добавить некоторые специализированные классы в какой-то тип напоминаний/каталог и включить их в качестве mixins, что также не создало бы уродства кода. В целом, ваше решение кажется действительным! –

0

Я не вижу проблемы с спагетти и фоновой работой в рубине на рельсах. Я думаю, что сделать их - путь. Проверьте, что вам подходит: http://railscasts.com/?tag_id=32

Смежные вопросы