RestKit, отношения «многие ко многим» между вопросами и тегами, такими как API Stackoverflow.

Мы используем RestKit для кэширования данных из удаленного веб-сервиса, аналогично API Stackoverflows.

В API есть вопросы и теги, но вместо получения тега в тексте мы получаем идентификатор тега.

Ресурс вопросов выглядит так:

{
  "items": [
    {
      "question_id": 11260172,
      "tags": [
          { "tag_id" : 1},
          { "tag_id" : 2},
          { "tag_id" : 3}
      ],
      "view_count": 1,
      [...]
}

Ресурс тегов выглядит так:

{
  "items": [
    {
      "id": 1,
      "name": "c#",
    },
    {
      "id": 2,
      "name": "java",
    },
    {
      "id": 3,
      "name": "php",
    }]
}

Мы хотели бы создать таблицу соединений между вопросами и тегами, чтобы у вопроса могло быть много тегов, а у тега было много вопросов.

У нас работает один ко многим, но не таблица соединений многие ко многим. Поэтому нам интересно, как отображение «многие ко многим» в RestKit должно искать такое отношение и как должна выглядеть модель данных.

Мы попробовали следующее сопоставление, но это не "многие ко многим".

[tagMapping mapKeyPath:@"id" toRelationship:@"questions" withMapping:tagsQuestionsMappingMapping];
[questionMapping mapKeyPath:@"tags" toRelationship:@"tags" withMapping:tagsQuestionsMappingMapping];

person Anders    schedule 29.06.2012    source источник


Ответы (1)


Просто так мы ясно. Поскольку ваш корневой ключ в этих двух разных веб-сервисах одинаков, вам нужно использовать две разные карты.

Вот пример сопоставления конечной точки ваших вопросов:

RKManagedObjectMapping* nested = [RKManagedObjectMapping mappingForClass: [NSDictionary class] inManagedObjectStore:nil];
[nested mapKeyPath: @"tag_id" toAttribute: @"id"];

RKManagedObjectMapping* questions = [RKManagedObjectMapping mappingForClass: [NSDictionary class] inManagedObjectStore: nil];
[questions mapAttributes: @"question_id", @"view_count", nil];  //I don't know your core data model...
[questions hasMany: @"tags" withMapping: nested];
[questions connectRelationship: @"tags" withObjectForPrimaryKeyAttribute: @"tag_id"];

А вот пример сопоставления конечной точки ваших тегов

RKManagedObjectMapping* tags = [RKManagedObjectMapping mappingForClass: [Tag class] inManagedObjectStore: store];
[tags mapAttributes: @"id", @"name", nil];

Уведомление:

1) Карта тегов каждый раз разная, потому что имя атрибута первичного ключа отличается в каждом фиде.

2) Я не знаю топографию ваших основных данных, поэтому эти карты, вероятно, не будут работать в том виде, в котором они есть. Вам нужно будет понять, что я делаю, и переделать это для вашего приложения.

3) Вы никогда не беспокоитесь о таблице соединений. Этим занимаются фреймворки.

person Paul de Lange    schedule 29.06.2012