0

次のシナリオがあります。RailsWebポータル(Rails 3.1)があり、RestKit 0.9.3(最新バージョン)を使用してiOSデバイスからポータルに接続しています。サーバーからのデータ構造をiOSデバイスのコアデータモデルにマッピングしたいと思います。モデルは次のように設計されています。

クラス

  • ユーザー
  • 役割
  • 役職
  • コメント

関係

  • ユーザーには0または1つのロールがあります/ロールには複数のユーザーがいます
  • ユーザーに複数の投稿があります/投稿に1人のユーザーがいます
  • 投稿に複数のコメントがあります/コメントに1つの投稿があります

問題は、RestKitのリレーションのデフォルトのマッピングにより、巨大なメッセージと冗長な転送が発生することです。これは、ロールを送信/受信すると、すべてのユーザーも転送され、ユーザーを送信/受信すると、ロールがに追加されるためです。各ユーザー。ユーザー、投稿、コメントでも同じことが起こります。それはデータが多いだけであり、私が考える限り、最善の解決策は、参照されるIDを送信し、各タイプを転送することです。これは、iOSデバイスからサーバーにデータを送信するときにロールのIDをユーザーのフィールド「role_id」にマッピングすることで完全に機能します。これは、Railsがそれをどう処理するかを理解しているためです。したがって、リレーションはリレーションとしてではなく、IDフィールドとしてマッピングされます。しかし、サーバーからユーザーを受信すると、デバイスに存在しない場合、エラーが発生します。

そこで調査したところ、RestKitがロールの主キーのみを送信するように、リレーションをマッピングして主キーのマッピングを使用できることがわかりました。しかし今、Railsはそれをどうするかを理解していません。これは次のようになります。

{"id":1、 "uid": "my_user_name"、 "pwd": "my_password"、 "role":{"id":0}}

しかし、Railsはそのようなものを期待しています:

{"id":1、 "uid": "my_user_name"; "pwd": "my_password"、 "role_id":0}

それが私の現状であり、この誤解を解決する方法が本当にわかりません。

助けていただければ幸いです。

4

1 に答える 1

1

そのための2つの可能な解決策があります:

1)レールモデルに、追加して役割関係を一括更新するという事実を認識させます。

accepts_nested_attributes_for :role

また

2)クライアントコードのシリアル化マッピングを変更します。

RKObjectMapping *userMapping = [RKObjectMapping mappingForClass:[User class]];
[userMapping mapKeyPath:@"id" toAttribute:@"userId"];
[userMapping mapKeyPath:@"uid" toAttribute:@"uid"];

...

[manager.mappingProvider registerMapping:userMapping withRootKeyPath:@"user"];

RKObjectMapping* userSerializationMapping = [manager.mappingProvider serializationMappingForClass:[User class]];
[userSerializationMapping mapKeyPath:@"role_id" toAttribute:@"role.id"];
于 2011-11-02T13:34:31.747 に答える