此代码可以优化还是重新考虑?这是标记的最佳方法吗?
以下代码是我的帖子模型中的回调。它创建一个记录,将标记与QuestionsTags joiner表中的帖子相关联。必要时,如果标签表中不存在给定标签,则该函数会创建它,然后使用其id在QuestionsTags表中创建新记录。
这种方法的难点在于QuestionsTags表依赖于tags表中可能存在或不存在的数据。
该函数采用以下表格:
tags(id, tagName),
posts(tags) // Comma delimited list
questionsTags(postId, tagId)
这个想法是循环一个用帖子提交的分隔的标签列表,并检查标签表中是否已经存在每个标签
如果标记存在:
如果标签尚不存在:
代码
/**
* @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功能。
答案 0 :(得分:2)
这就是我接近它的方式。好奇为什么你用“,”作为分隔符?如果“用户,没有,离开,空间”怎么办?我只是使用逗号和trim()列表元素。