我正在用Scala、Salat、Casbah、Mongo、Play2、BackboneJS做一个项目。。。但在同一时间里要学习的东西很多。。。我对Scala很满意,但我发现我的代码很糟糕,我真的不知道改进它的解决方案是什么
基本上我的用例是:
- 一个MongoDB对象被Play2发送到浏览器的JS代码
- JS代码更新对象数据(通过骨干模型)
- JS将更新后的JSON发送回服务器(通过Backbone保存方法发送,并通过带有JSON-bodyparser的Play接收)
- Play收到的JSON应该更新MongoDB中的对象
- 出于安全原因,某些字段不应更新(对象id、creationDate…)
我的问题是最后一部分。我使用带有Salat的case类来表示存储在MongoDB中的对象。
我真的不知道如何处理我从JS代码中收到的JSON。
-
我应该将JSON绑定到Salat案例类中,然后让Mongo用全新的案例类对象覆盖以前的对象数据吗?如果是的话,Play2或Salat有没有办法从接收到的JSON中自动创建回case类?
-
我是否应该使用要更新的字段的$set单独处理JSON字段?
-
我应该使case类的元素可变吗?例如,这就是我们在Java中使用Hibernate所做的:从DB中获取对象,更改其状态,然后保存它。但这似乎不是使用Scala的合适方法。。。
如果有人能为我的用例给我一些建议,那就太好了,因为我真的不知道该怎么办:(
编辑:我在这里问了一个相关的问题:我应该用不可变或可变的数据结构来表示数据库数据吗?
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项目,展示您的问题,并将其发布到Salat邮件列表https://groups.google.com/group/scala-salat寻求帮助。
您的问题实际上有两个问题:
- 如何使用Play Salat
- 如何阻止更新某些字段
第一个问题的答案在Play Salat文档中。你的第二个问题可以用几种方法回答。
a。当更新从Backbone推送到服务器时,您可以获取对象id并在数据库中找到它。此时,您拥有对象的两个副本。这时,您可以启动一个业务规则,以确保发件人没有试图更改这些字段。
或
b。您可以将一些字段放在嵌入文档的另一个文档中。客户端可以出于渲染目的访问它们,但API不允许将它们推回到Mongo。
或
c。您可以编写一个自定义更新查询,忽略不希望更改的字段。
事实上,答案很简单:我不知道案例类上有一个内置的复制方法,可以在更改一些数据的同时复制一个不可变的案例类。
我没有嵌套的事例类结构,但托尼·莫里斯关于使用Lenses的建议似乎也很好。