Сделать один столбец зависимым от ассоциации Sequelize - PullRequest
0 голосов
/ 12 июля 2020

У меня есть таблица под названием ДОМ . И у него есть столбец с именем STATUS .

У меня также есть таблица с именем TASK , и в ней также есть столбец с именем STATUS .

В каждом доме много задач. И если есть одна задача со статусом inProgress, статус дома должен быть inProgress. И если все задачи - done, то дом - done.

Я хочу, чтобы этот столбец статуса дома зависел от статуса всех его задач.

Когда я позвоните /getHouses, вот что я делаю, чтобы добавить свойство под названием status для каждого домашнего объекта, потому что в настоящее время у меня нет столбца STATUS в таблице HOUSE .

exports.getMyHouses = (req, res) => {
  const page = myUtil.parser.tryParseInt(req.query.page, 0)
  const limit = myUtil.parser.tryParseInt(req.query.limit, 10)

  db.House.findAndCountAll({
    where: { userId: req.user.id },
    include: [
      {
        model: db.Task,
        as: "task",
        include: [
          {
            model: db.Photo,
            as: "photos"
          }
        ]
      },
      {
        model: db.Address,
        as: "address"
      }
    ],
    offset: limit * page,
    limit: limit,
    order: [["id", "ASC"]],
  })
    .then(data => {
      let newData = JSON.parse(JSON.stringify(data))
      const houses = newData.rows

      for (let house of houses) {
        house.status = "done"

        const tasks = house.task
        for (let task of tasks) {
          if (task.status == "inProgress") {
            house.status = "inProgress"
            break
          }
        }
      }

      res.json(myUtil.response.paging(newData, page, limit))
    })
    .catch(err => {
      console.log("Error get houses: " + err.message)
      res.status(500).send({
        message: "An error has occured while retrieving data."
      })
    })
}

РЕДАКТИРОВАТЬ: Я только что понял, что, возможно, я смогу обновлять столбец статуса дома каждый раз, когда есть обновление статуса задачи. Я никогда не думал об этом раньше.

Но мне все равно понравилось бы, если бы кто-нибудь подтвердил, что это хорошая стратегия или есть ли лучшая.

1 Ответ

0 голосов
/ 12 июля 2020

Вариант, который у вас есть, жизнеспособен, пока вам не нужна фильтрация по статусу дома. По сути, это будет называться виртуальным полем (поскольку это не что-то непосредственно из базы данных). Если вам нужно выполнить фильтрацию по этому полю, тогда вам нужно будет запросить все задачи InProgress и получить уникальные идентификаторы домов.

Вы также можете обновить столбец статуса дома при обновлении задачи, но вы можете запустить в некоторых условиях гонки, если, например, было сделано несколько запросов на обновление задач в одном доме. Обязательно запустите транзакцию здесь, если вы тоже. Запросы / фильтрация для домов с задачами InProgress будут намного быстрее, поскольку вы можете запрашивать их напрямую. Однако обновления будут медленнее, так как вам нужно будет запустить обновление задачи, запрос количества задач и запрос обновления дома.

У обоих есть свои плюсы и минусы, в основном это зависит от вашего приложения требование дизайна.

...