Моделирование бесконечно повторяющихся задач в расписании (приложение rails, подобное календарю)

Это было довольно камнем преткновения. Предупреждение: это не вопрос, а скорее объяснение того, что я придумал. У меня вопрос - у вас есть способ лучше? Есть ли какая-нибудь распространенная техника для этого, с которой я не знаком? Похоже, это тривиальная проблема.

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

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

Один из способов - создать их, когда вы просматриваете свое расписание. Итак, когда пользователь продвигается на месяц вперед, будут созданы повторяющиеся задачи. Конечно, это означает, что вы больше не можете просто работать с записями задач в базе данных. Каждая операция SELECT над задачами, которые вы когда-либо выполняли, должна выполняться в контексте определенного диапазона дат, чтобы повторяющиеся задачи в этом диапазоне дат сохранялись. Это бремя обслуживания и производительности, но выполнимо.

Хорошо, но как насчет исходной задачи? Каждая повторяющаяся задача связывается с правилом повторения, которое ее создало, и каждое правило повторения должно знать исходную задачу, которая запустила повторение. Последнее важно, потому что вам нужно клонировать исходную задачу в новые даты, когда пользователь просматривает свое расписание. Думаю, тоже выполнимо.

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

Однако, когда пользователь перемещается по задачам в расписании, как мы узнаем, есть ли в конкретный момент нужно создать новую задачу повторения? Мы спрашиваем правило повторения: «Эй, я должен продолжить задачу на этот день?» и там написано да или нет. Если на этот день уже есть задание на это повторение, мы его не создаем. Все хорошо, за исключением того, что пользователь также может просто удалить одну из повторяющихся задач, которая была автоматически сохранена. В этом случае, следуя нашей логике, система заново создаст задачу, которая была удалена. Не хорошо. Это означает, что нам нужно сохранить задачу, но пометить ее как удаленную для этого повторения. Мех.

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

Обновление : Поскольку на этот вопрос трудно дать точный ответ, я одобряю наиболее полезное понимание дизайна / архитектуры, которое имеет наилучшее соотношение полезности / компромисса для такого типа проблемы. Он не должен охватывать все детали.

11
задан Max Chernyak 18 March 2011 в 01:46
поделиться