Scala错误表明val不是模型对象的成员,尽管它是?

时间:2012-02-14 07:27:54

标签: scala

摘要:我从成员事务表中提取用户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值我很困惑为什么会产生这个错误。是语法问题还是我映射用户的问题?谢谢!

2 个答案:

答案 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
    ))))
  }