Ist das ein guter Ansatz für den Umgang mit Tagging?
-
09-10-2019 - |
Frage
Kann dieser Code optimiert oder neu berücksichtigt werden? Ist das eine optimale Annäherung an Tagging?
Der folgende Code ist ein Rückruf in meinen Beiträgen Modell. Es erstellt einen Datensatz, der ein Tag mit einem Beitrag in einer QuestionsTags Joiner Tabelle zuordnet. Wenn nötig, wenn ein bestimmte Tag nicht bereits in der Tags-Tabelle vorhanden, die Funktion, die sie schafft, dann seine ID verwendet den neuen Datensatz in der QuestionsTags Tabelle zu erstellen.
Die Schwierigkeit bei diesem Ansatz ist die QuestionsTags Tabelle auf Daten in der Tabelle Tags abhängt, die existieren können oder nicht.
Die Funktion übernimmt die folgenden Tabellen:
tags(id, tagName),
posts(tags) // Comma delimited list
questionsTags(postId, tagId)
Die Idee ist, eine Schleife über eine getrennte Liste von Tags mit einem Post eingereicht und überprüfen, ob jeder Tag bereits in der Tags-Tabelle vorhanden
Wenn Tag vorhanden ist:
- Überprüfen Sie, ob es bereits QuestionTag Rekord für diesen Beitrag und dieser Tag in der QuestionTags Tabelle.
- Wenn ja, nichts zu tun (der Verein bereits vorhanden)
- Wenn nein, erstellen Sie einen neuen QuestionTag Datensatz die ID des vorhandenen Tag und die postID mit
Wenn Tag nicht bereits vorhanden ist:
- Erstellen Sie den neuen Tag in der Tags Tabelle
- Verwenden Sie seine ID einen neuen QuestionsTags Datensatz erstellen
Code
/**
* @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;
}
}
}
}
Zur Info:. Ich verwende CFWheels in meiner Anwendung, die die ORM-Funktionen verwendet, erklärt
Lösung
Das ist ziemlich viel, wie ich es nähern würde. Neugierig, warum Sie verwenden „“ als Trennzeichen? Was passiert, wenn die „user, nicht verlassen, einen, Raum“? Ich würde nur Komma und trim (), um das Listenelement.