计算选择输出中的派生列-Scala Slick 3.2.3

问题描述 投票:0回答:1

我正在尝试编写一些REST API以使用Scala Slick 3.2.3来获取数据。有没有一种方法可以计算派生的列并将其包含在返回的输出中?

我的模特:

case class Task(id: Option[TaskId], title: String, dueOn: String, status: String, createdAt: String, updatedAt: String)

表类:

class TasksTable(tag: Tag) extends Table[Task](tag, _tableName = "TASKS") {
  def id: Rep[TaskId] = column[TaskId]("ID", O.PrimaryKey, O.AutoInc)
  def title: Rep[String] = column[String]("TITLE")
  def dueOn: Rep[String] = column[String]("DUE_ON")
  def status: Rep[String] = column[String]("STATUS")
  def createdAt: Rep[String] = column[String]("CREATED_AT")
  def updatedAt: Rep[String] = column[String]("UPDATED_AT")
  def * = (id.?, title, dueOn, status, createdAt, updatedAt) <> ((Task.apply _).tupled, Task.unapply)
}

DAO:

object TasksDao extends BaseDao {
  def findAll: Future[Seq[Task]] = tasksTable.result
}

我想在响应json中添加一个名为timeline的列,并根据dueOn值计算出值“过期”,“今天”,“明天”,“即将到来”等。

我尝试搜索,但找不到任何帮助。一个例子或任何指针的任何帮助,将不胜感激。谢谢!

scala slick dao derived
1个回答
0
投票

首先,我将从为timeline定义枚举模型开始:

object Timelines extends Enumeration {
  type Timeline = Value
  val Overdue: Timeline = Value("overdue")
  val Today: Timeline = Value("today")
  val Tomorrow: Timeline = Value("tomorrow")
  val Upcoming: Timeline = Value("upcoming")
}

然后将dueOn值转换为Timeline的功能:

import Timelines._
def dueOnToTimeline(dueOn: LocalDate): Timeline = {
    val today = LocalDate.now()
    Period.between(today, dueOn).getDays match {
      case days if days < 0 => Overdue
      case 0 => Today
      case 1 => Tomorrow
      case _ => Upcoming
    }
}

以及一些用法示例:

val dueOne = "2020-03-08"
    val format = DateTimeFormatter.ISO_DATE // replace it with formatter you use for a date
    val dueOneDate = Try(LocalDate.parse(dueOne, format))
    println(dueOneDate.map(dueOnToTimeline))

将产生(仅在给出答案的当天)下一个输出:

Success(today)

[注意:将日期作为字符串存储在不良设计的数据库中,请尝试使用更适当的类型DATE(例如,对于MySql)。

希望这会有所帮助!

© www.soinside.com 2019 - 2024. All rights reserved.