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:

  1. Überprüfen Sie, ob es bereits QuestionTag Rekord für diesen Beitrag und dieser Tag in der QuestionTags Tabelle.
  2. Wenn ja, nichts zu tun (der Verein bereits vorhanden)
  3. Wenn nein, erstellen Sie einen neuen QuestionTag Datensatz die ID des vorhandenen Tag und die postID
  4. mit

Wenn Tag nicht bereits vorhanden ist:

  1. Erstellen Sie den neuen Tag in der Tags Tabelle
  2. Verwenden Sie seine ID einen neuen QuestionsTags Datensatz
  3. 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

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top