如何在使用Play Scala时修剪平滑列映射中的选项字符串
使用Slick播放框架时,从固定字符数据库列中修剪值的正确方法是什么,正确位置在哪里 我想修剪字符串的原因是数据库模式指定了如何在使用Play Scala时修剪平滑列映射中的选项字符串,scala,playframework-2.0,slick-2.0,Scala,Playframework 2.0,Slick 2.0,使用Slick播放框架时,从固定字符数据库列中修剪值的正确方法是什么,正确位置在哪里 我想修剪字符串的原因是数据库模式指定了字符(40)列类型,而不是字符变化的类型 我有这个案例课: case class Test(id: Long, trimMe: Option[String]) 我有一个光滑的表格关系: class Tests(tag: Tag) extends Table[Test](tag, "test") { def id = column[Long ]("test_
字符(40)
列类型,而不是字符变化的
类型
我有这个案例课:
case class Test(id: Long, trimMe: Option[String])
我有一个光滑的表格关系:
class Tests(tag: Tag) extends Table[Test](tag, "test") {
def id = column[Long ]("test_id", O.PrimaryKey, O.AutoInc)
def trimMe = column[String]("trim_me" )
def * = (id, trimMe) <> (Test.tupled, Test.unapply _)
}
这一切都有效,但返回一个空格填充的字符串
我在JSON映射器中尝试了一些修剪的变体:
object TrimTest {
implicit val testWrite = new Writes[Test] {
def writes(test: Test) = Json.obj(
"id" -> test.id ,
"trim1" -> test.trimMe.map(_.trim) ,
"trim2" -> test.trimMe.fold("") {_.trim} ,
"trim3" -> test.trimMe.map(_.trim).getOrElse("")
)}
}
上述trim1
有效,但当可选值不存在时返回null
trim2
确实适用于所有情况,但我在不同的地方看到它指出map
然后getForElse
比使用fold
更惯用Scala
trim3
刚刚超出我目前对Scala的理解极限,显示了我的意图,但没有编译
trim3
情况下的编译错误为:
类型失配;
发现:对象
必需:play.api.libs.json.json.JsValueWrapper
我当然可以接受使用
折叠
,但是通常的方法是什么呢?获取值然后修剪怎么样
scala> val strOpt = Option("Some string not trimmed ")
strOpt: Option[String] = Some(Some string not trimmed )
scala> strOpt.getOrElse("").trim
res0: String = Some string not trimmed
scala> val strNone = Option(null)
strNone: Option[Null] = None
scala> strNone.getOrElse("").trim
res2: String = ""
编辑:
您有一个Test
行,它是一个case类,有两个字段,id
和trimMe
,您想将这个类映射到JSON,但问题是您还想trimMe
字段
如果您有一个列[String]
,从Slick
的角度来看,它意味着一个非可选字段,但是您的case类有一个可选字段,或者(Test
和Tests
)都有一个可选的trimMe
字段(这意味着可以为空的列),或者它们没有(这意味着该列是强制性的)
最后,您拥有的case类是您在数据库中拥有的一行的表示,这就是Slick查询返回的(*),它应该反映您的模式声明
对于微调问题
- 如果
trimMe
是列[Option[String]]
您的案例类具有trimMe:Option[String]
,因此您可以getOrElse
并确保返回String
,然后trim
val someString = Option("some String ")
someString.getOrElse("").trim
- 如果
trimMe
是一个列[String]
您的case类有trimMe:String
,那么只需将其包装在选项中,然后getOrElse
然后trim
:
val str = "some other string "
Option(str).getOrElse("").trim
这样无论是None
还是Some
都不会引发异常
(*)不一定,您可以使用返回列而不是整行的查询。关于模式匹配的简单逻辑:
def trimOptionString(in: Option[String]): Option[String] = in.map(_.trim) match {
case None => None
case Some("") => None
case Some(x) => Some(x)
}
我认为我的问题更多的是在一个典型的Play/Scala/Slick/JSON体系结构中应该在哪里以及如何做。从你的回答中我仍然不清楚我应该怎么做。你的编辑为我指出了解决方案,谢谢。我可以简单地执行test.trimMe.getOrElse(“”.trim。我想我之前试过了,但后来我尝试了很多不同的方法。。。
def trimOptionString(in: Option[String]): Option[String] = in.map(_.trim) match {
case None => None
case Some("") => None
case Some(x) => Some(x)
}