Rails 3.1 & RestKit 0.9.3 - отображение ссылок - PullRequest
0 голосов
/ 19 октября 2011

У меня есть следующий сценарий: У меня есть веб-портал rails (Rails 3.1), и я использую RestKit 0.9.3 (новейшая версия) для подключения портала с устройства iOS. Я хочу отобразить структуру данных с сервера на базовую модель данных на устройстве iOS. Модель выполнена следующим образом:

Классы

  • Пользователь
  • Роль
  • Сообщение
  • Комментарий

Отношения

  • Пользователь имеет ноль или одну роль / Роль может иметь несколько пользователей
  • У пользователя есть несколько сообщений / У сообщения есть один пользователь
  • В сообщении есть несколько комментариев / В комментарии есть одно сообщение

Проблема в том, что отображение отношений по умолчанию в RestKit приводит к огромным сообщениям и избыточной передаче, потому что когда я отправляю / получаю Роли, все пользователи также передаются, а если я отправляю / получаю пользователей, роль добавляется к каждому пользователю. То же самое происходит с пользователями, сообщениями и комментариями. Это просто для большого количества данных, и лучшее решение, насколько я могу подумать, это просто отправить идентификаторы, на которые ссылаются, и передать каждый тип. Это прекрасно работает, когда я отправляю данные с устройства iOS на сервер, сопоставляя идентификаторы роли с полем «role_id» в User, потому что Rails понимает, что с этим делать. Таким образом, отношения отображаются не как отношения, а как поля идентификаторов. Но когда я получаю Пользователи с сервера, которого нет на устройстве, я получаю сообщение об ошибке, потому что RestKit не понимает, что делать с отображением, поскольку нет объекта Role, связанного с объектом User.

Итак, я исследовал и обнаружил, что вы можете отобразить отношения и использовать сопоставление первичного ключа, чтобы RestKit отправлял только Первичный ключ роли. Но сейчас Rails не понимает, что с этим делать. Это выглядит примерно так:

{ "Идентификатор": 1, "UID": "my_user_name", "PWD": "my_password", "роль": { "Идентификатор": 0 } }

Но Rails ожидает что-то вроде этого:

{ "Идентификатор": 1, "UID": "my_user_name"; "PWD": "my_password", "Role_id": 0 }

Это мое текущее состояние, и я действительно не знаю, как решить это недоразумение.

Буду очень благодарен за любую помощь!

1 Ответ

1 голос
/ 02 ноября 2011

Для этого есть два возможных решения:

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