Это хороший подход к тегированию? - PullRequest
1 голос
/ 10 января 2011

Может ли этот код быть оптимизирован или переработан?Это оптимальный подход к тегированию?

Следующий код является функцией обратного вызова в моей модели сообщений.Он создает запись, которая связывает тэг с сообщением в объединительной таблице QuestionsTags.При необходимости, если данный тег еще не существует в таблице тегов, функция создает его, а затем использует свой идентификатор для создания новой записи в таблице QuestionsTags.

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

Функция предполагает наличие следующих таблиц:

tags(id, tagName),
posts(tags) // Comma delimited list
questionsTags(postId, tagId)

Идея состоит в том, чтобы зацикливать список тегов с разделителями, представленный сотправьте сообщение и проверьте, существует ли каждый тег в таблице тегов

Если тег существует:

  1. Проверьте, существует ли уже запись QuestionTag для этогоpost и этот тег в таблице QuestionTags.
  2. Если да, ничего не делать (связь уже существует)
  3. Если нет, создайте новую запись QuestionTag, используя идентификатор существующего тега и postId

Если тег еще не существует:

  1. Создать новый тег в таблице тегов
  2. Использовать его идентификатор для созданияновый 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.

1 Ответ

2 голосов
/ 10 января 2011

Вот так я бы подошел. Любопытно, почему вы используете "," в качестве разделителя? Что делать, если «пользователь, не уходи, пробел»? Я бы просто использовал запятую и trim () элемент списка.

...