2011-10-19 31 views
0

我有以下場景: 我有一個Rails網站門戶(Rails 3.1),我使用RestKit 0.9.3(最新版本)連接門戶網站iOS設備。 我想將數據結構從服務器映射到iOS設備上的核心數據模型。該模型設計如下:Rails 3.1&RestKit 0.9.3 - 映射引用

  • 用戶
  • 角色
  • 評論

關係

  • 用戶具有零個或一個角色/角色可以有多個用戶
  • 用戶有多個帖子/ A郵政有一個用戶
  • 甲張貼有多個評論/ A註釋具有一個郵政

問題是,RestKit中關係的默認映射會導致巨大的消息和冗餘傳輸,因爲當我發送/接收角色時,所有用戶都將被傳輸,如果我發送/接收用戶,角色是添加到每個用戶。用戶,帖子和評論也會發生同樣的情況。 就我所能想到的而言,它只是提供很多數據和最佳解決方案,只是發送引用的ID並傳輸每種類型的ID。 當我通過將角色的ID映射到用戶的字段「role_id」將數據從iOS設備發送到服務器時,這非常適用,因爲Rails確實明白如何處理該問題。所以這些關係並不像關係那樣映射,而是像ID域那樣映射。但是,當我從服務器接收用戶時,如果設備上不存在用戶,我會收到一個錯誤,因爲RestKit不知道如何處理映射,因爲沒有Role對象鏈接到User對象。

因此,我研究並發現可以映射關係並使用主鍵的映射,以便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

有兩種可能的解決方案是:

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"];