1

私は Scala、Salat、Casbah、Mongo、Play2、BackboneJS を使用したプロジェクトに取り組んでいます...しかし、同時に学ぶべき新しいことはかなりたくさんあります... Scala は問題ありませんが、自分のコードを見つけましたくだらないし、それを改善するための解決策が本当にわかりません。

基本的に私のユースケースは次のとおりです。

  • MongoDB オブジェクトは、Play2 によってブラウザの JS コードに送信されます
  • JS コードはオブジェクト データを更新します (バックボーン モデルを介して)
  • JS は更新された JSON をサーバーに送り返します (Backbone save メソッドによって送信され、json ボディパーサーを使用して Play によって受信されます)。
  • Play が受け取った JSON は MongoDB のオブジェクトを更新するはずです
  • 一部のフィールドは、セキュリティ上の理由から更新できないようにする必要があります (オブジェクト ID、作成日など)。

私の問題は最後の部分です。MongoDB に格納されているオブジェクトの表現として Salat でケース クラスを使用しています。

JS コードから受け取った JSON を処理する方法がよくわかりません。

  • JSON を Salat ケース クラスにバインドし、Mongo に完全な新しいケース クラス オブジェクトで以前のオブジェクト データをオーバーライドするように依頼する必要がありますか? その場合、Play2 または Salat を使用して、受信した JSON からケース クラスを自動的に作成する方法はありますか?

  • 更新するフィールドに $set を使用して、JSON フィールドを個別に処理する必要がありますか?

  • ケース クラスの要素を変更可能にする必要がありますか? たとえば、Hibernate を使用して Java で実際に行っていることは、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

実際、答えは非常に単純です。一部のデータを変更しながら不変のケースクラスをコピーできる、ケースクラスに組み込みのコピーメソッドがあることを知りませんでした。

私はネストされたケースクラス構造を持っていませんが、レンズを使用するというTonyMorrisの提案もいいようです。

于 2012-11-25T15:01:38.940 に答える
0

あなたの質問には実際には2つの問題があります:

  1. Play Salat の使い方
  2. 特定のフィールドが更新されないようにするにはどうすればよいですか。

最初の質問に対する答えは、Play Salat のドキュメントにあります。2 番目の質問には、いくつかの方法で答えることができます。

a. 更新がバックボーンからサーバーにプッシュされると、オブジェクト ID を取得してデータベースで見つけることができます。その時点で、オブジェクトの両方のコピーがあります。その時点で、ビジネス ルールを起動して、送信者がそれらのフィールドを変更しようとしていないことを確認できます。

また

b. フィールドの一部を埋め込みドキュメントの別のドキュメントに配置できます。クライアントはレンダリング目的でそれらにアクセスできますが、API はそれらを Mongo にプッシュバックすることを許可しません。

また

c. 変更したくないフィールドを無視するカスタム更新クエリを作成できます。

于 2012-10-14T17:09:43.500 に答える