У меня есть следующий код:Преобразовать Future [List [String]] в список [String]
Some(db.run(unionPermissionQuery.result).map(_.map(_.name).toList))
и я получаю следующее сообщение об ошибке:
[error] found : scala.concurrent.Future[List[String]]
[error] required: List[String]
[error] Some(db.run(unionPermissionQuery.result).map(_.map(_.name).toList)),
[error] ^
[error] one error found
Так что я предполагаю, что я должен преобразовать Future[List[String]]
- List[String]
. Я новичок в scala, если это слишком легко.
Полный код:
def find(loginInfo: LoginInfo): Future[Option[models.admin.User]] = {
val userQuery = for {
dbLoginInfo <- loginInfoQuery(loginInfo)
dbUserLoginInfo <- Userlogininfo.filter(_.logininfoid === dbLoginInfo.id)
dbUser <- User.filter(_.userid === dbUserLoginInfo.userid)
} yield dbUser
db.run(userQuery.result.headOption).map { dbUserOption =>
dbUserOption.map { user =>
val permissionQuery = for {
dbUserPermission <- Userpermission.filter(_.userid === user.userid)
dbPermission <- Permission.filter(_.id === dbUserPermission.permissionid)
} yield dbPermission
val rolePermissionQuery = for {
dbUserRole <- Userrole.filter(_.userid === user.userid)
dbRole <- Role.filter(_.id === dbUserRole.roleid)
dbRolePermission <- Rolepermission.filter(_.roleid === dbRole.id)
dbPermission <- Permission.filter(_.id === dbRolePermission.permissionid)
} yield dbPermission
val unionPermissionQuery = permissionQuery union rolePermissionQuery
models.admin.User(
UUID.fromString(user.userid),
user.firstname,
user.lastname,
user.jobtitle,
loginInfo,
user.email,
user.emailconfirmed,
Some(db.run(unionPermissionQuery.result).map(_.map(_.name).toList)),
user.enabled)
}
}
Я просто хочу, чтобы получить пользователь, а затем заполнить все разрешения. Индивидуальные разрешения и разрешения, унаследованные ролью, назначенной пользователю.
Лучше ли получить пользователя, а затем выполнить другой запрос, чтобы получить разрешения на основе идентификатора пользователя? Я так не думаю.
Несмотря на то, что никогда не работал с «Будущим», я ожидаю, что единственный способ получить ценность из «Будущего» - это ждать, что означает вызов «результата» для класса STD-lib 'Future'. Это смысл «Будущего», нет? – ziggystar
Пожалуйста, поставьте контекст. В * Play! * Вам, вероятно, следует всегда избегать «Await'ing», поэтому, я полагаю, вы должны адаптировать окружающий код для работы с 'Future' – Odomontois