我正在尝试编写一些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
值计算出值“过期”,“今天”,“明天”,“即将到来”等。
我尝试搜索,但找不到任何帮助。一个例子或任何指针的任何帮助,将不胜感激。谢谢!
首先,我将从为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)。
希望这会有所帮助!