摘要:我从成员事务表中提取用户ID列表,然后用于从数据库生成用户列表。然后,这将用于生成发送到列出与帐户关联的用户的页面的JSON。
背景:在Play上使用Squeryl的Scala代码!框架
将用户映射到JSON生成器时 错误: value id is not a member of Option[models.User]
代码:这里的代码连续用于最终生成JSON
def memberIds(accountId: Long) = { from(DB.members)(m =>
where(m.accountId === accountId)
select (m)).map(_.userId).toSet
}
def membersToAccount(id: Long) = {
memberIds(id).map( i => models.User.get(i))
}
def listMembers(accountId: Long) = {
Json(generate(Account.membersToAccount(accountId)
.map(user => Map(
"id" -> user.id,
"name" -> user.name,
"username" -> user.username
))))
}
困惑: User类包含一个看起来像case class User(
val id: Long, etc.
的id值我很困惑为什么会产生这个错误。是语法问题还是我映射用户的问题?谢谢!
答案 0 :(得分:7)
这就是原因模型。用户包含在Option container中(实际上,这是monad)。这就像尝试直接在用户列表上调用User的方法,例如:List(someUsers).id
基本上这意味着,这个值可以是Some(非null包装器)或Nothing(就像null
更好)。
此外,最好不要在选项上使用get
,请考虑上面的链接以获取详细信息。
答案 1 :(得分:2)
解决了这个问题。每个用户对象都包含在像Some(用户)这样的选项中。所以要解决这个问题,我必须在每个属性上使用.get
方法。
def listMembers(accountId: Long) = {
Json(generate(Account.membersToAccount(accountId)
.map( user => Map(
"id" -> user.get.id,
"name" -> user.get.name,
"username" -> user.get.emailAddress
))))
}