Базовые Объекты Выборки Данных, Которые Находятся в Отношениях к другому объекту

Прототип делает его очень простым

new Ajax.Request( '/myurl', {
  method:  'get',
  parameters:  { 'param1': 'value1'},
  onSuccess:  function(response){
    alert(response.responseText);
  },
  onFailure:  function(){
    alert('ERROR');
  }
});

14
задан 17 July 2009 в 19:20
поделиться

4 ответа

Если у вас уже есть экземпляр A, просто получите доступ к связанным экземплярам B через аксессор A.

Если вам нужно напрямую получить все B, связанные с конкретным A (вы не 't в этом случае), вы должны создать запрос на выборку для объекта B с предикатом, основанным на (обратном) отношении Bs к A. (Конкретный синтаксис будет зависеть от имени обратной связи и от того, будет ли это обратное отношение относится к одному или ко многим.)

6
ответ дан 1 December 2019 в 13:33
поделиться

Вы должны указать обратную связь в классе B, чтобы делать то, что вы просите.

Однако я не уверен, почему вы возражаете (без каламбура), чтобы схватить набор объектов B уже в объекте A. Хотя сами объекты загружаются лениво, поскольку у вас уже есть A в памяти, у меня есть догадка (хотя специалисту нужно будет проверить), что было бы более эффективно просто захватить набор от A, чем указать новый NSPredicate и создать совершенно новый Fetch.

Конечно, под «более эффективным» мы говорим о миллисекундах, даже на таком медленном устройстве, как iPhone. Я бы взял набор из объекта A, потому что синтаксис чище. Тот факт, что он также может быть быстрее, является плюсом.

5
ответ дан 1 December 2019 в 13:33
поделиться

У меня похожая ситуация.

Я хочу использовать NSFetchedResultsController для управления B в отношении «один ко многим» (A - >> B). Один из способов сделать это - создать предикат, подобный приведенному ниже, и применить его к сущности B:

NSPredicate *Predicate = [NSPredicate predicateWithFormat:
                                   @"ANY hasParent.label == 'A'"];

Но это ужасно медленный способ делать что-то, и его следует избегать любой ценой. Я пробовал это на 25000 объектов, чтобы получить около 300, и симулятору потребовалось около 15 секунд. Он не завершал выборку на iPhone и неоднократно давал сбой.

Другой способ - сделать то, что уже упоминалось, создать массив NSArray из набора, удерживаемого A, и отсортировать его. Если вы отправите allObjects в набор, вы получите обратно массив. A - это полученный ранее объект NSManagedObject.

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc]
                                   initWithKey:@"Name"
                                   ascending:YES];

NSArray *lotsOfB = [[[A hasRelationsTo]
                   allObjects]
                   sortedArrayUsingDescriptors: sortDescriptors];

Это очень быстро. Никаких лагов в симуляторе или на устройстве. Но вы не можете использовать NSFetchedResultsController печальные времена: - (

Надеюсь, что это поможет.

2
ответ дан 1 December 2019 в 13:33
поделиться

Я тоже в похожей ситуации.

У меня не так много объектов, как у pingbat, но мне потребовалось 15 секунд, чтобы получить "ANY hasParent.label == 'A'"

Мне нужно использовать NSFetchedREsultsController, следовательно, мне нужно переделать модель. Я сделал это, чтобы сохранить отношение ко всем как свойство строки и построить предикат "hasParent contains %@".

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

0
ответ дан 1 December 2019 в 13:33
поделиться