1

我正在使用扩展 SecureSocial 的身份特征的用户类在 Slick 中实现用户表。我在从可选的不可存储数据库类型对象转换为可选的原始数据库类型时遇到问题。

参考:Slick docsSecureSocial docs (要为 SecureSocial 生成 API 文档,请从他们的 Github中提取,进入他们的“module-code”目录,然后运行play doc。然后查看 module-code/target/api 文件夹并打开上 index.html)

是)我有的

User在案例类中获取此参数:

oAuth1Info: Option[securesocial.core.OAuth1Info]

Scaladoc 中 OAuth1Info 的新实例构造函数如下所示:

new OAuth1Info(token: String, secret: String)

现在在我的*方法中(如此处所述):

def * = stuffs ~ oAuth1InfoToken ~ oAuth1InfoToken ~ moreStuff <> 
    ( // the following is the apply method
    { t => User(stuffs, 
        Some(OAuth1Info( (t._9).getOrElse(""), (t._10).getOrElse("")) ), 
        moreStuffs)
    }, // the following is the unapply method
    {
        (r: User) => Some( (r.stuffs, 
            (r.oAuth1Info).getOrElse(None).token , // ERROR
            (r.oAuth1Info).getOrElse(None).secret , // ERROR
            r.moreStuffs) )
    }

我正在尝试做的事情

如果未提供,则插入None数据库,并且oAuth1Info

Option[securesocial.core.OAuth1Info] = None

否则,获取OAuth1Info对象并获取令牌和机密并将其存储到我的数据库中各自的列中。

除了这个映射投影是 500+ 字符行之外,我是否需要做一些

oAuth1Info match {
    case None: None
    case _: oAuth1Info.token
}

? 单行模式匹配器可以吗?在这一点上,我迷失在我的代码中......

谢谢你的帮助


如果你想看看我到目前为止的完整实现......

Scala + Slick + SecureSocial = 可悲的是 tl;dr 代码

我知道这段代码是一堵文字墙。如果存在多行 Scala 代码会很棒吗?巴斯宾

4

2 回答 2

1

我还没有完全掌握您原始问题中的类型,但是oAuth1Unapply您答案中的方法可以重写为

def oAuth1Unapply(smth: Option[securesocial.core.OAuth1Info]): (String, String) =
  smth.map(oa => (oa.token, oa.secret)).getOrElse(("",""))

map方法将函数应用于Optionif it is not的内容None,并将结果作为Some值返回,否则将结果保留为None

于 2013-07-01T04:21:06.950 回答
0

我太愚蠢。我得到了它。

所以我确实使用了模式匹配器。

def oAuth1Unapply(smth: Option[securesocial.core.OAuth1Info]): (String, String) =  {
    smth match {
          case None => ("", "")
          case _ => (smth.getOrElse(OAuth1Info("","")).token, smth.getOrElse(OAuth1Info("","")).secret)
        }
}

然后我做

val oa1 = oAuth1Unapply(r.oAuth1Info)
def * = stuffs ~ oAuth1InfoToken ~ oAuth1InfoToken ~ moreStuff <> 
( // the following is the apply method
{ t => User(stuffs, 
    Some(OAuth1Info( (t._9).getOrElse(""), (t._10).getOrElse("")) ), 
    moreStuffs)
}, // the following is the unapply method
{
    (r: User) => Some( (r.stuffs, 
        oa1._1, oa2._2
        r.moreStuffs) )
}
于 2013-07-01T03:38:19.033 回答