1

我正在使用 Scala、Salat、Casbah、Mongo、Play2、BackboneJS 开展一个项目……但同时要学习很多新东西……我对 Scala 没问题,但我找到了我的代码蹩脚的,我真的不知道改进它的解决方案是什么。

基本上我的用例是:

  • 一个MongoDB对象被Play2发送到浏览器的JS代码
  • JS 代码更新对象数据(通过 Backbone 模型)
  • JS 将更新后的 JSON 发送回服务器(由 Backbone 保存方法发送,并由 Play 使用 json bodyparser 接收)
  • Play 收到的 JSON 应该更新 MongoDB 中的对象
  • 出于安全原因,某些字段不应更新(对象 id、creationDate...)

我的问题是最后一部分。我使用带有 Salat 的案例类作为存储在 MongoDB 中的对象的表示。

我真的不知道如何处理从 JS 代码收到的 JSON。

  • 我是否应该将 JSON 绑定到 Salat 案例类中,然后要求 Mongo 用全新的案例类对象覆盖以前的对象数据?如果是这样,Play2 或 Salat 有没有办法从收到的 JSON 中自动创建案例类?

  • 我应该为我想要更新的字段单独处理我的 JSON 字段吗?

  • 我应该使我的案例类的元素可变吗?这就是我们在 Java 中使用 Hibernate 所做的实际操作:从 DB 中获取对象,更改其状态,然后保存它。但这似乎不是使用 Scala 的合适方式......

如果有人可以为我的用例给我一些建议,那就太好了,因为我真的不知道该怎么做:(

编辑:我在这里问了一个相关问题:我应该用不可变或可变数据结构表示数据库数据吗?

4

3 回答 3

1

Salat 使用 lift-json 处理 JSON - 请参阅https://github.com/novus/salat/wiki/SalatWithPlay2

Play 本身使用 Jerkson,这是解码模型对象的另一种方法 -有关示例,请参见http://blog.xebia.com/2012/07/22/play-body-parsing-with-jerkson/ 。

随意制作一个小示例 Github 项目来演示您的问题,并发布到https://groups.google.com/group/scala-salat上的 Salat 邮件列表寻求帮助。

于 2012-10-15T13:20:41.883 回答
0

你的问题确实有两个问题:

  1. 如何使用 Play Salat。
  2. 如何防止更新某些字段。

您的第一个问题的答案在于Play Salat 文档。您的第二个问题可以通过几种方式回答。

一个。当更新从 Backbone 推送到服务器时,您可以获取对象 ID 并在数据库中找到它。此时,您拥有该对象的两个副本。此时,您可以触发业务规则以确保发件人没有尝试更改这些字段。

或者

湾。您可以将某些字段放在嵌入文档的另一个文档中。客户端可以访问它们以进行渲染,但您的 API 不允许将它们推回 Mongo。

或者

C。您可以编写一个自定义更新查询,忽略您不想更改的字段。

于 2012-10-14T17:09:43.500 回答
0

实际上答案很简单:我不知道案例类中有一个内置的复制方法,它允许在更改某些数据的同时复制不可变的案例类。

我没有嵌套的案例类结构,但 Tony Morris 建议使用 Lenses 似乎也不错。

于 2012-11-25T15:01:38.940 回答