Вопрос

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

Классы

  • Пользователь
  • Роль
  • Публикация
  • Комментарий

Отношения

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

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

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

{ "id": 1, "uid": "my_user_name", "pwd": "my_password", "роль":{ "id": 0 } }

Но Rails ожидает чего-то подобного:

{ "id":1, "uid": "имя__пользователя";"pwd": "my_password", "role_id": 0 }

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

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

Это было полезно?

Решение

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

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"];
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top