这是处理标记的好方法吗?

时间:2011-01-10 15:12:39

标签: model-view-controller coldfusion refactoring tagging cfwheels

此代码可以优化还是重新考虑?这是标记的最佳方法吗?

以下代码是我的帖子模型中的回调。它创建一个记录,将标记与QuestionsTags joiner表中的帖子相关联。必要时,如果标签表中不存在给定标签,则该函数会创建它,然后使用其id在QuestionsTags表中创建新记录。

这种方法的难点在于QuestionsTags表依赖于tags表中可能存在或不存在的数据。

该函数采用以下表格:

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

这个想法是循环一个用帖子提交的分隔的标签列表,并检查标签表中是否已经存在每个标签

如果标记存在:

  1. 检查此帖子以及QuestionTags表格中是否已有QuestionTag记录。
  2. 如果是,则不执行任何操作(关联已存在)
  3. 如果不是,请使用现有标记的id和postId
  4. 创建一个新的QuestionTag记录

    如果标签尚不存在:

    1. 在代码表
    2. 中创建新代码
    3. 使用其ID创建新的QuestionsTags记录
    4. 代码

      /**
      * @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;
                  }
              }
          }
      }
      

      仅供参考:我在我的应用程序中使用CFWheels,这解释了所使用的ORM功能。

1 个答案:

答案 0 :(得分:2)

这就是我接近它的方式。好奇为什么你用“,”作为分隔符?如果“用户,没有,离开,空间”怎么办?我只是使用逗号和trim()列表元素。