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 0.10.0 & ios 6.1 - objectLoaderWithResourcePath:delegate 方法不进行 http 调用
Restkit 0.20 对象在获取 json 响应后未映射