我正在Slick中实现一个Users表,其中的User类扩展了SecureSocial的Identity特征。我无法从可选的不可存储数据库类型对象转换为可选的原始数据库类型。
要参考:Slick docs,SecureSocial docs(要为SecureSocial生成API文档,请从their Github拉出,进入“模块代码”目录,然后运行{{1然后查看module-code / target / api文件夹并打开index.html)
在play doc
案例类中使用此参数:
User
Scaladoc中OAuth1Info的新实例构造函数如下所示:
oAuth1Info: Option[securesocial.core.OAuth1Info]
现在使用new OAuth1Info(token: String, secret: String)
方法(as explained here):
*
如果未提供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
对象并获取令牌和密码,并将其存储到我的数据库中各自的列中。
在这个映射投影的顶部是一个500+字符行,我是否需要做某种
OAuth1Info
?可以使用单线模式匹配器吗?我现在在代码中迷失了......
感谢您的帮助
如果您希望到目前为止看到我的完整实施......
我知道这段代码是一面文字。如果它存在,多行Scala代码在这里会很棒吗? Pastebin
答案 0 :(得分:1)
我还没有完全掌握原始问题中的类型,但您答案中的oAuth1Unapply
方法可以重写为
def oAuth1Unapply(smth: Option[securesocial.core.OAuth1Info]): (String, String) =
smth.map(oa => (oa.token, oa.secret)).getOrElse(("",""))
map
方法将函数应用于Option
的内容(如果它不是None
),并将结果作为Some
值返回,或以其他方式离开结果为None
。
答案 1 :(得分: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) )
}