Rails 3.1& RestKit 0.9.3 - 引用的映射

时间:2011-10-19 08:31:14

标签: mapping ruby-on-rails-3.1 reference restkit

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

  • 用户
  • 作用
  • 注释

关系

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

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

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

{ “ID”:1, “UID”: “my_user_name” “PWD”: “MY_PASSWORD” “角色”:{   “ID”:0 } }

但是Rails期待这样的事情:

{ “ID”:1, “UID”: “my_user_name”; “PWD”: “MY_PASSWORD” “ROLE_ID”:0 }

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

我会非常感谢任何帮助!

1 个答案:

答案 0 :(得分: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"];