Каков правильный способ и где это правильное место, чтобы обрезать значение из столбца базы данных с фиксированными символами при использовании платформы Play с Slick?
Причина, по которой я хочу обрезать строку, заключается в том, что в схеме базы данных указан тип столбца character(40)
, а не тип character varying
.
У меня есть этот класс корпуса:
case class Test(id: Long, trimMe: Option[String])
У меня есть это отношение таблицы Slick:
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 ,
"trim" -> test.trimMe
)}
}
Все это работает, но возвращает строку, заполненную пробелами.
Я попробовал несколько вариантов обрезки в картографе 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
является «более идиоматической Scala», чем использование fold
.
trim3
только что превзошел предел моего нынешнего понимания Scala и показывает мои намерения, но не компилируется.
Ошибка компиляции в случае trim3
:
несоответствие типов; найдено: Требуемый объект: play.api.libs.json.Json.JsValueWrapper
Я, конечно, могу жить с использованием fold
, но как это обычно делается?