Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在使用Play Scala时修剪平滑列映射中的选项字符串_Scala_Playframework 2.0_Slick 2.0 - Fatal编程技术网

如何在使用Play Scala时修剪平滑列映射中的选项字符串

如何在使用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_

使用Slick播放框架时,从固定字符数据库列中修剪值的正确方法是什么,正确位置在哪里

我想修剪字符串的原因是数据库模式指定了
字符(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)
}