Использование методов поиска базы данных в определении модели базы данных
Так что в моей системе есть пользователи, которые могут публиковать "ответы" на сообщения других пользователей. Каждый ответ может быть одобрен или понижен другими пользователями. "Карма" пользователя - это сумма положительных и отрицательных голосов за все опубликованные ответы.
Поэтому мне нужно два раза получить доступ к этой информации о голосовании: чтобы увидеть текущие и отрицательные голоса данного поста; и показывать карму пользователя рядом с его именем пользователя на всех его постах или ответах.
Система представляет собой бэкэнд 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 и т. Д. В настоящее время я делаю это в функциях контроллера. Причина, по которой я не уверен, заключается в том, что я не знаю, можете ли вы или должны использовать методы поиска для базы данных в определении модели для той же базы данных?