Мне удалось выработать решение, которое я получил после использования шаблона прокси.Что я действительно хотел, так это концепция «извлечения контекста».Я хотел знать, от какого родителя я первоначально выбрал модель (ребенок, имеющий несколько родителей).
Ключом к решению проблемы было обеспечение поддержки контекста выборки. Мы отвечали за объекты запроса, а не за наши модели.
var activity = roadtrip.destinations().all().activities().first();
Мы начинаем с roadtrip
модели и вызываем destinations
функция.Эта функция возвращает объект запроса.Этот объект запроса похож по дизайну на реализацию Rails в Rails в том, что он ленив, фактически не возвращает никаких записей, пока вы не вызовете all
, first
, each
и т. Д. Объект запроса имеет переменную context
, которая указываетего родителю - модель roadtrip
.
Вызов all
возвращает объект коллекции, чей context
указывает на запрос, из которого он был вызван.Каждый элемент в коллекции - это прокси (queried item
), который охватывает каждую базовую модель destination
.Прокси поддерживает ссылку на свою коллекцию.Самый простой способ получить этот прокси-сервер выглядит следующим образом:
var proxied_destination = Object.create(destination);
Таким образом, вы можете назначить context
для прокси, не влияя на оригинал.
proxied_destination.context = collection;
Это позволяет«мастерская» модель осталась нетронутой и, таким образом, отображалась на личность.Это было бы невозможно, если бы наша модель поддерживала прямую ссылку на свою коллекцию, поскольку модель может принимать участие в нескольких результирующих наборах (мы можем выполнить столько запросов, сколько захотим), и в моем сценарии мы ожидаем только один контекст (родительский).
Мы вызываем activities
, который предоставляет нам другой объект запроса, контекст которого является прокси destination
.Мы вызываем first
и вместо того, чтобы получить коллекцию, мы получаем прокси activity
, имеющий контекст, который указывает на объект запроса действий.
Таким образом, использование прокси-серверов позволяет нам указывать вверх и, таким образом, "подниматься" наиерархия объектов при сохранении моделей с отображением идентификаторов, которые не обращают внимания на эту иерархию и могут легко принимать участие в нескольких коллекциях (наборах результатов).