Может ли этот код быть оптимизирован или переработан?Это оптимальный подход к тегированию?
Следующий код является функцией обратного вызова в моей модели сообщений.Он создает запись, которая связывает тэг с сообщением в объединительной таблице QuestionsTags.При необходимости, если данный тег еще не существует в таблице тегов, функция создает его, а затем использует свой идентификатор для создания новой записи в таблице QuestionsTags.
Сложность этого подхода заключается в таблице QuestionsTagsзависит от данных в таблице тегов, которые могут существовать или не существовать.
Функция предполагает наличие следующих таблиц:
tags(id, tagName),
posts(tags) // Comma delimited list
questionsTags(postId, tagId)
Идея состоит в том, чтобы зацикливать список тегов с разделителями, представленный сотправьте сообщение и проверьте, существует ли каждый тег в таблице тегов
Если тег существует:
- Проверьте, существует ли уже запись QuestionTag для этогоpost и этот тег в таблице QuestionTags.
- Если да, ничего не делать (связь уже существует)
- Если нет, создайте новую запись QuestionTag, используя идентификатор существующего тега и postId
Если тег еще не существует:
- Создать новый тег в таблице тегов
- Использовать его идентификатор для созданияновый QueЗапись stionsTags
Код
/**
* @hint Sets tags for a given question.
**/
private function setTags()
{
// Loop over the comma and space delmited list of tags
for (local.i = 1; local.i LTE ListLen(this.tags, ", "); local.i = (local.i + 1))
{
// Check if the tag already exists in the database
local.tag = model("tag").findOneByTagName(local.i);
// If the tag exists, look for an existing association between the tag and the question in the QuestionTag table
if (IsObject(local.tag))
{
local.questionTag = model("questionTag").findOneByPostIdAndTagId(values="#this.postId#,#local.tag.id#");
// If no assciatione exists, create a new QuestionTag record using the tagId and the postId
if (! IsObject(local.questionTag))
{
local.newQuestionTag = model("questionTag").new(postId = this.id, tagId = local.tag.id);
// Abort if the saving the new QuestionTag is unsuccesful
if (! local.newQuestionTag.save())
{
return false;
}
}
}
// If the tag does not exist create it
else
{
local.newTag = model("tag").new(tagName = local.i, userId = this.ownerUserId);
// Abort if the the new tag is not saved successfully
if (! local.newTag.save())
{
return false;
}
// Otherwise create a new association in the QuestionTags table using the id of the newly created tag and the postId
local.newQuestionTag = model("questionTag").new(postId = this.id, tagId = local.newTag.id);
// Abort if the new QuestionTag does not save correctly
if (! local.newQuestionTag.save())
{
return false;
}
}
}
}
К вашему сведению: я использую колеса CFW в своем приложении, что объясняет используемые функции ORM.