只读取播放中所需的数据2

时间:2013-09-24 00:55:02

标签: scala playframework slick

我遇到的情况是,我的数据模型中有许多数据,但这些数据是服务器端提供的,只显示在gui中。我还没有找到一个很好的方法来使用光滑的游戏2。例如,跟踪创建和修改数据(创建,lastUpdated):

    case class TrackedData(id:Option[Long],description:String, created:DateTime:new DateTime(),lastUpdated:DateTime=new DateTime())

    object TrackedDatas extends Table[TrackedData]("TrackedData"){
      def id = column[Long]("id",O.primaryKey)
      def description = column[String]("description", O.NotNull)
      def created = column[Timestamp]("created", O.NotNull)
      def lastUpdated = column[Timestamp]("lastUpdated", O.NotNull)
      def * = id.? ~ created ~ lastUpdated <>(TrackedData.apply _, TrackedData.unapply _)
}

在此示例中,“description”是我希望用户提供的唯一内容,创建的和lastUpdated将在服务器端提供,但我确实希望在Web上显示此信息。要做到这一点似乎相当笨重。首先,您必须将create和lastUpdated映射到可选字段,以便在您不提交表单绑定时不会中断,但这意味着您不能使用默认情况类.apply和.unapply moethods并且必须提供映射来解决这个问题 然后控制器变为:

object TrackedDataController extends Controller {
val form = Form(
    mapping(
      "id" -> optional(longNumber),
      "created" -> optional(jodaDate("dd.MM.yyyy HH:mm:ss", DateTimeZone.UTC)),
      "lastUpdated" -> optional(jodaDate("dd.MM.yyyy HH:mm:ss", DateTimeZone.UTC)),
      "description" -> text
    )((id, _, _) => TrackedData(id = id))
      ((trackedData:TrackedData) => Some(trackedData.id,Option(trackedData.created),Option(trackedData.lastUpdated)  ,trackedData.descscription))
  )
}

如果这是异常,那也不会太糟糕,但是大多数数据都将遵循这种模式(加上createdBy和lastModifiedBy),所有这些都是必需的并且提供服务器端但需要显示在浏览器端。在隐藏字段中发布“只读”数据是唯一的方法吗?除非您在更新期间通过检索现有值并将其复制到传入数据来明确地保护它,否则上面还有另外一个问题:您将通过任何只读数据进行写入:

  update(data:TrackedData){
        val existing:T = this.byId(toSave.id.get).get
        toSave.created = existing.created
        toSave.lastUpdated = new DateTime()
        this.where(_.id===toSave.id).update(toSave)
    }

这一切都不太可怕,似乎必须有更好的方法。建议?

1 个答案:

答案 0 :(得分:0)

一个选项是使用play-autosource,它基本上为CRUD提供不同的后端(mongo,slick,...),并通过在Play的json api上运行来实现。使用变换器,您可以转换和验证数据。但是,这是一个实验项目。

作为一个副节点,我们正在开发一个试图解决这些问题的开源项目。如果你有兴趣,我们将在3月中旬在游戏邮件组中宣布它。