Феникс Экто Модель Вложенности - PullRequest
0 голосов
/ 27 февраля 2020

Поэтому я пытаюсь создать систему контента в Фениксе, где есть курсы, папки и уроки, а объект является основой всего, поэтому:

Объект:

has_many :children, Content.Object
belongs_to :parent, Content.Object

Курс

belongs_to :object, Content.Object

Папка

belongs_to :object, Content.Object

Однако этот метод имеет проблему. Я не могу найти способ получить папку из курса. Я хочу иметь возможность сделать что-то вроде этого:

iex(1)> course = Content.get_course!(1)
iex(2)> [folderObj | _] = course.object.children
iex(3)> folder = folderObj.item

Но, очевидно, поле элемента не существует на объекте. Как бы я добавил это? (Также я могу добавить больше кода, если он не понятен, просто прокомментируйте)

1 Ответ

2 голосов
/ 27 февраля 2020

Практическое правило: Если вы обнаружили, что называете что-то «Объект», вы делаете это неправильно.

Даже если предоставленный вами код создавал то, что вы ожидаете, course.object.children вернул бы коллекцию и курсов и папок, и не было никакого способа захватить заголовок этого списка и ожидать, что это будет папка (как вы делаете в строке 2.) Кроме того, у нас нет полиморфизма в OOP, что означает . Course - это Course, оно также не может быть «несколько Object».

Поэтому вы должны отдельно построить дерево из объектов . Для этого ваша object схема выглядит хорошо, и в интернете полно примеров того, как построить дерево.

Помимо детей, у объекта должно быть много курсов , много папок и много уроков . Тогда вызов course.object.folders (при условии, что все предварительно загружено правильно) приведет к сбору папок , как вы хотели.

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

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

...