Rails 3.1 & RestKit 0.9.3 - 引用映射

Posted

技术标签:

【中文标题】Rails 3.1 & RestKit 0.9.3 - 引用映射【英文标题】:Rails 3.1 & RestKit 0.9.3 - mapping of references 【发布时间】:2011-10-19 08:31:13 【问题描述】:

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

用户 角色 发布 评论

关系

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

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

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

“身份证”:1, "uid":"my_user_name", “密码”:“我的密码”, “角色”: “身份证”:0

但 Rails 期待这样的事情:

“身份证”:1, “uid”:“我的用户名”; “密码”:“我的密码”, “角色 ID”: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"];

【讨论】:

以上是关于Rails 3.1 & RestKit 0.9.3 - 引用映射的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Restkit + iOS 发布到 Rails

使用 RestKit 0.20 备份核心数据

Restkit 0.10.0 & ios 6.1 - objectLoaderWithResourcePath:delegate 方法不进行 http 调用

Restkit 0.20 对象在获取 json 响应后未映射

RestKit 0.20.0-rc1 mappingResult 304 Not Modified后为空

Rails RestKit POST 请求 json 的根类丢失