Найти всех с определенной ассоциацией и подвести итог всех * других * партнеров в Sequelize - PullRequest
0 голосов
/ 10 октября 2018

Хорошо, поэтому я использую Sequelize с sqlite, чтобы создать систему голосования в реальном времени с веб-сокетами.Схема:

const Connection = sequelize.define("connection", {
    socketId: {
        type: Sequelize.UUID,
        primaryKey: true
    },
    name: { type: Sequelize.STRING, unique: true, allowNull: false }
});

const Vote = sequelize.define("vote", {
    postId: {
        type: Sequelize.UUID,
        primaryKey: true,
        onDelete: "CASCADE"
    },
    socketId: {
        type: Sequelize.UUID,
        primaryKey: true,
        onDelete: "CASCADE"
    },
    vote: {
        type: Sequelize.INTEGER,
        allowNull: false,
        validate: {
            isIn: [[-1, 1]]
        }
    }
});

Vote.belongsTo(Connection, { foreignKey: "socketId" });

const Post = sequelize.define("post", {
    id: {
        type: Sequelize.UUID,
        defaultValue: Sequelize.UUIDV4,
        primaryKey: true
    },
    content: { type: Sequelize.STRING, allowNull: false }
});

Post.belongsTo(Connection, {
    foreignKey: "authorSocketId",
    onDelete: "CASCADE"
});

Post.hasMany(Vote);

Когда клиент отключается, я обновляю все другие клиенты, какие сообщения были удалены.

Когда клиент отключается, мне нужно суммировать голоса каждого сообщения, которое клиентпроголосовал и отправить обновленный подсчет голосов клиентам.Но проблема в том, что мне нужно исключить клиента, отключившегося от суммы голосования.Это то, что я придумал, но это кажется слишком сложным:

Post.findAll({
  attributes: [
      "id",
      [
          literal(
              // Sum up all the votes not by the disconnecting client
              `(SELECT SUM("votes"."vote") FROM votes WHERE "votes"."postId"="post"."id" AND "votes"."socketId"!=$1 )`
          ),
          "upvotes"
      ]
  ],
  bind: [disconnectedSocketId],
  where: {
      // Post must not be by the disconnecting client
      authorSocketId: { [Op.ne]: disconnectedSocketId }
  },
  include: [
      {
          // Post must be voted on by the disconnecting client
          model: Vote,
          required: true,
          where: {
              socketId: disconnectedSocketId
          }
      }
  ]
}).then(posts => {
  // Once I have all the posts and their sums I update all the clients
});

Так что это мой вопрос.Есть ли более элегантный способ найти все сообщения, за которые проголосовал отключающий клиент, и суммировать все свои голоса, исключая голос отключенного клиента.

Я все еще новичок в SQL и реляционных базах данных, так что если у вас естьлюбой другой совет, который был бы оценен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...