Как передать идентификатор внешнего ключа из запроса в элемент строки обновления? - PullRequest
1 голос
/ 27 мая 2019

Я использую Slick 3.3.0, и у меня есть сценарий использования для обновления таблицы паролей, но элемент поиска - это нечто, называемое LoginInfo, которое затем связывается с целевым обновляемым PasswordInfo через его user_id это очень упрощенная версия моего варианта использования:

def update(id: Long, hasher: String, password: String, salt: Option[String]): Future[ExtPasswordInfo] = {
    // first look up a loginInfo by some id, then find the connected userId and use 
    // it to update the PasswordInfo.
    val action = (for {
      loginInfo <- LoginInfo if loginInfo.id === id
      passwordInfo <- PasswordInfo if passwordInfo.userId === loginInfo.userId
    } yield passwordInfo).update(PasswordInfoRow(??? /* <<<< I need userId here */, hasher, password, salt))
    db.run(action)
}

Но после того, как запрос выдаст passwordInfo и я включу метод update, у меня нет доступа к ключу userId.

Если бы это было возможно, мне понадобилось бы:

... yield passwordInfo).update(pi => PasswordInfoRow(pi.userId, ... 

Как это сделать в Slick?

1 Ответ

0 голосов
/ 27 мая 2019

После некоторого поиска души я решил это так:

def update(id: Long, hasher: String, password: String, salt: Option[String]): Future[ExtPasswordInfo] = {
    // first look up a loginInfo by some id, then find the connected userId and use 
    // it to update the PasswordInfo.
    val action = (for {
      userId <- LoginInfo.filter(_.id === id).result.head.map(_.userId)
    } yield userId).flatMap { userId =>
      val updated = PasswordInfoRow(userId, hasher, password, salt)
      PasswordInfo.update(updated).map(_ => updated.toExt)
    }.transactionally()
    db.run(action)
}
...