0

我有以下场景:我有一个 Rails Web 门户(Rails 3.1),我使用 RestKit 0.9.3(最新版本)从 iOS 设备连接门户。我想将数据结构从服务器映射到 iOS 设备上的核心数据模型。模型设计如下:

课程

  • 用户
  • 角色
  • 邮政
  • 评论

关系

  • 一个用户有零个或一个角色/一个角色可以有多个用户
  • 一个用户有多个帖子/一个帖子有一个用户
  • 一个帖子有多个评论/一个评论有一个帖子

问题是,RestKit 中关系的默认映射会导致大量消息和冗余传输,因为当我发送/接收角色时,所有用户也将被传输,如果我发送/接收用户,角色被添加到每个用户。用户、帖子和评论也是如此。这只是很多数据,就我所能想到的而言,最好的解决方案就是发送 ID,这些 ID 被引用并传输每种类型。当我通过将角色的 ID 映射到用户中的字段“role_id”将数据从 iOS 设备发送到服务器时,这非常有效,因为 Rails 确实知道如何处理它。所以关系没有被映射为关系,而只是作为 ID 字段。但是当我从服务器接收用户时,设备上不存在这些用户,我收到一个错误,

所以我研究发现你可以映射关系并使用主键的映射,这样RestKit只会发送角色的主键。但是现在 Rails 不明白如何处理它。它看起来像这样:

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

但 Rails 期待这样的事情:

{ "id":1, "uid":"my_user_name"; “密码”:“我的密码”,“角色 ID”:0 }

这就是我现在的状态,我真的不知道如何解决这个误解。

我将非常感谢任何帮助!

4

1 回答 1

1

有两种可能的解决方案:

1) 让您的 Rails 模型意识到您希望通过添加来大规模更新角色关系这一事实

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 回答