Использование методов поиска базы данных в определении модели базы данных

Так что в моей системе есть пользователи, которые могут публиковать "ответы" на сообщения других пользователей. Каждый ответ может быть одобрен или понижен другими пользователями. "Карма" пользователя - это сумма положительных и отрицательных голосов за все опубликованные ответы.

Поэтому мне нужно два раза получить доступ к этой информации о голосовании: чтобы увидеть текущие и отрицательные голоса данного поста; и показывать карму пользователя рядом с его именем пользователя на всех его постах или ответах.

Система представляет собой бэкэнд Express.js, использующий Sequelize для ORM в базе данных SQLite. В настоящее время так определяется модель голосования и отношение к пользователям и ответам:

// vote.js
module.exports = (sequelize, DataTypes) => {
    return sequelize.define('Vote', {
        upVote: {
            type: DataTypes.BOOLEAN,
            allowNull: false
        }
    })
}

// within response.js
models.Response.belongsToMany(models.User, {
    through: models.Vote,
    as: 'Votes'
})

// within user.js
models.User.belongsToMany(models.Response, {
    through: models.Vote,
    as: 'Votes'
})

Таким образом, у меня есть объединяющие таблицы "Голоса" со столбцом для пользователя, который проголосовал, столбцом для значения голоса и столбцом для ответа, с которым он связан.

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

У меня вопрос, должен ли я выполнить этот расчет с самими моделями? Например, в пределах User добавить этот атрибут:

// part of user.js model definition
karma: {
    type: DataTypes.INTEGER,
    get() {
        try {
            const upVotes = await Vote.count({
                where: {
                    upVote: true,
                    UserId: this.getDataValue('id')
                }
            })

            const upVotes = await Vote.count({
                where: {
                    upVote: true,
                    UserId: this.getDataValue('id')
                }
            })

            return upVotes - downVotes
        } catch (err) {
            console.log(err)
            return 0
        }
    }
}

Или я должен вместо этого выполнить этот расчет в моем Users Контроллер файл и добавить его в тело JSON ответа перед отправкой ответа, чтобы сказать, запрос на мой сервер, чтобы показать информацию пользователя?

Просто интересуюсь здесь лучшими практиками! Я новичок в JS/Node/Full-Stack и т. Д. В настоящее время я делаю это в функциях контроллера. Причина, по которой я не уверен, заключается в том, что я не знаю, можете ли вы или должны использовать методы поиска для базы данных в определении модели для той же базы данных?

0 ответов

Другие вопросы по тегам