У меня интересная проблема. Я создаю систему ревизий для моего приложения. Это работает так, что каждый раз, когда создается новый объект post, объект post пытается создать запись истории для каждого из его атрибутов, которые изменились.
Так, если post.subject был отредактирован, новая запись ревизии создается в таблице истории. Он будет хранить только новый текст темы (а также связанный пост и пользователя, который его сделал). Если изменено более одного атрибута, они передаются в массиве, и каждый атрибут будет храниться в отдельной записи, сгруппированной по UUID.
Чтобы сократить избыточные записи, объект истории попытается найти любые существующие ревизии и обновить их if the existing revisions are younger than a certain time limit.
Таким образом, мы можем сохранить изменения, внесенные за короткий промежуток времени в той же ревизии. Если они не моложе, то создаются новые ревизии.
Сценарий:
- Пользователь Foo меняет тему сообщения (создается ревизия темы).
- Пользователь Foo возвращается и меняет тело и тему (существующая ревизия субъекта обновляется; создается новая ревизия тела). Обе версии должны иметь одинаковый UUID.
Каждый объект записи имеет три атрибута subject, body, footer
. Я уже выполнил простую часть: создавал новые ревизии, если их не было, зацикливая массив аргументов, содержащий данные ревизии.
// Find existing revisions younger than some time value
local.revisions = this.findAll(where="rules go here", returnAs="struct");
// If no revisions are found create new ones
if (! arrayLen(local.revisions))
{
// Create UUID to group revisions
local.revisionGUID = createUUID();
// loop over the arguments array (contains revision data) and create new revisions
for (local.i in arguments.data)
local.history = this.new(properties=local.i, revisionGUID=local.revisionGUID);
local.histroy.save();
}
// If some revision data does exist, update existing ones, and create the new ones; the UUID for new revisions should use the UUID of existing revisions
else
{
logic goes here
}
Теперь о сложной части. Если массив ревизий возвращается, мне нужно сделать следующее:
- Сравните его с массивом в области args.
- Для каждой ревизии в области args, которая не существует в существующем массиве ревизий, мне нужно его создать. Для ревизии в области аргументов args, которая существует (имеется в виду, что у нее есть совпадающая ревизия в соответствии с возрастным пределом), мне нужно обновить ее данные данными соответствующей ревизии в области args.
Это не может быть так просто, как arrayContains (), потому что данные, хранящиеся в массивах, являются структурами ... Я не знаю, как сравнивать массивы, содержащие структуры!
Вопрос:
- Правильно ли я подхожу к проблеме?
- Какие методы доступны мне для выполнения функций, упомянутых выше?