Как увеличить столбец таблицы postgres после выбора текущего значения qith Node pg? - PullRequest
0 голосов
/ 17 апреля 2019

Я создаю приложение, в котором есть таблицы пользователей, вопросов, ответов, комментариев и голосования. Не уверен, что это правильное решение, но я решил превратить таблицу голосования в таблицу объединения, содержащую идентификаторы всех других таблиц, вместо того, чтобы каждая другая таблица имела столбец voice_count, поскольку голоса будут принадлежать любой другой таблице.

Стол для голосования выглядит следующим образом-

    CREATE TABLE vote (
     "questionVoteCount"       SERIAL,
     "answerVoteCount"         SERIAL,
     "commentVoteCount"        SERIAL,
     "accountId"               INTEGER REFERENCES account(id),
     "questionId"              INTEGER REFERENCES question(id),
     "answerId"                INTEGER REFERENCES answer(id),
     "commentId"               INTEGER REFERENCES comment(id),
     PRIMARY KEY ("questionVoteCount", "answerVoteCount", 
     "commentVoteCount")
     );

Моя модель выглядит так -

    class Vote {
constructor({
    questionVoteCount,
    answerVoteCount,
    commentVoteCount,
    accountId,
    questionId,
    answerId,
    commentId
} = {}) {
    this.questionVoteCount =
        this.questionVoteCount || VOTE_DEFAULTS.questionVoteCount
    this.answerVoteCount = this.answerVoteCount || VOTE_DEFAULTS.answerVoteCount
    this.commentVoteCount =
        this.commentVoteCount || VOTE_DEFAULTS.commentVoteCount
    this.accountId = accountId || VOTE_DEFAULTS.accountId
    this.questionId = questionId || VOTE_DEFAULTS.questionId
    this.answerId = answerId || VOTE_DEFAULTS.answerId
    this.commentId = commentId || VOTE_DEFAULTS.commentId
}

static upVoteQuestion({ accountId, questionId }) {
    return new Promise((resolve, reject) => {
        pool.query(
            `UPDATE vote SET "questionVoteCount" = 
                               "questionVoteCount" + 1 WHERE 
                               "questionId" = $1 AND "accountId" = 
                               $2`,
            [questionId, accountId],
            (err, res) => {
                if (err) return reject(err)
                resolve()
            }
        )
    })
}

Я хотел, чтобы у каждого вопроса / ответа / комментария был подсчет голосов, и пользователь, размещающий сообщение на маршруте голосования, будет увеличивать или уменьшать голоса любого из вышеперечисленных. Как я могу сделать это? У меня такое ощущение, что я допустил ошибку с самой таблицей для голосования. Должен ли я придерживаться своей первоначальной идеи о наличии столбца voice_count в каждой таблице?

Ответы [ 2 ]

1 голос
/ 17 апреля 2019

Вы объявили questionVoteCount как тип SERIAL, что означает автоинкремент.Похоже, что вы хотите сделать, это определить как INTEGER.

0 голосов
/ 20 апреля 2019

ОБНОВЛЕННЫЙ СТОЛ - благодаря alfasin

CREATE TABLE vote (
 "questionVoteCount"       INTEGER DEFAULT 0 NOT NULL,
 "answerVoteCount"         INTEGER DEFAULT 0 NOT NULL,
 "commentVoteCount"        INTEGER DEFAULT 0 NOT NULL,
 "accountId"               INTEGER REFERENCES account(id),
 "questionId"              INTEGER REFERENCES question(id),
 "answerId"                INTEGER REFERENCES answer(id),
 "commentId"               INTEGER REFERENCES comment(id),

);

Вместо выполнения оператора '' UPDATE ', мне помогло' INSERT '-' voiceCount 'с 1 для upvote и -1 для downvote.

Теперь я могу запустить «SELECT SUM (« voiceCount »)», чтобы получить все голоса за вопросы, ответы, комментарии, пользователей и все, что угодно.

...