Как объект может наследовать свойство в структуре рекурсивной модели?

У меня есть структура, идентичная этому сообщению здесь: Как создать рекурсивную связь «один ко многим» с использованием основных данных?

Это выглядит примерно так:

    cage ---------- animal 1
             |
             |_____ animal 2
             |
             |_____ animal 3 ____ animal 4
                              |
                              |__ animal 5
                                      |
                                      |_____ animal 6

И я реализовал свои модели именно так, как сделал правильный ответ, т.е.

enter image description here

Проблема для меня в том, что с этой структурой только animal 1 имеет свойство cage, отличное от nil, но я бы хотел, чтобы ВСЕ потомки животных имели это свойство cage, чтобы я мог запросить свойство клетки animal6.cage.

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

Можно ли унаследовать свойство клетки для каждого животного?

0
0
34
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы используете такие термины, как «наследование» и «дочерний элемент», не имеющими значения для Core Data. У вас есть Cage, связанный с Animal. Animal имеет отношение к самому себе.

Что касается Core Data, здесь нет родительских / дочерних отношений или наследования. Если один Animal связан с другим, это всего лишь два экземпляра с отношениями. Одно не может унаследовать значение от другого, потому что оно не является «родительским» ни в каком смысле, используемом Core Data. Эти два экземпляра являются двумя независимыми объектами, и они не наследуют ничего больше, чем любые два объекта, не относящихся к Core Data.

Из этого следует, что установка свойства cage не делает Animal «прямым потомком» клетки, а просто говорит, что он связан с клеткой. Если вы хотите найти cage для любого произвольного Animal без установки cage для каждого экземпляра, вам нужно сделать что-то вроде (псевдокод Swift-ish):

func cage(for animal:Animal) -> Cage {
    var currentAnimal = animal
    var cage = currentAnimal.cage
    while cage == nil && currentAnimal.parent != nil {
        currentAnimal = currentAnimal.parent
        cage = currentAnimal.cage
    }
    return cage
}

Это нормально, если вы просто хотите найти клетку для животного, но не можете использовать ее в запросе на выборку. Если вам нужно что-то, что вы можете использовать при извлечении, вам, вероятно, потребуется добавить вторую связь от Animal к Cage, чтобы вы могли отличить "родительское" животное от любых других. Каждый Animal будет иметь значение для одного из отношений, а другое отношение будет зарезервировано для родителя.

Я подумал, что могу сделать что-то вроде функции, которую вы опубликовали - хотя не уверен, что вы имели в виду в последнем абзаце

Hamish Johnson 12.04.2018 19:52

Если вы хотите сделать что-то вроде доставки каждого животного в определенной клетке, независимо от их родительского / дочернего статуса, вы не можете использовать метод в ответе - вам потребуется другой подход. Если вам это не нужно, то функция - это то, что вам нужно.

Tom Harrington 12.04.2018 20:09

Другие вопросы по теме