[英]Ecto, Phoenix: How to update a model with an embeds_many declaration?
[英]Phoenix Ecto Model Nesting
所以我嘗試在phoenix中做一個內容系統,里面有課程、文件夾和課程,對象是一切的支柱,所以:
目的:
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
但顯然 item 字段不存在於對象上。 我將如何添加這個? (如果不清楚,我也可以添加更多代碼,只需評論)
經驗法則是:如果您發現自己將某個東西命名為“對象”,那么您就做錯了。
即使你提供的代碼是建立你所期望的, course.object.children
將返回兩個課程和文件夾的集合,有沒有辦法抓住這個列表的頭部,並希望它會是一個文件夾(如你在第 2 行做。)另外,我們在 OOP 中沒有多態性,在elixir 中沒有意義。 Course
是Course
,它不能也是“有點Object
。
所以你應該單獨構建一個對象樹。 為此,您的object
模式看起來不錯,並且互聯網上充滿了如何構建樹的示例。
除了孩子,對象應該有很多課程,很多文件夾和很多課程。 然后對course.object.folders
的調用(假設所有內容course.object.folders
正確預加載)將產生您想要的文件夾集合。
要訪問所有文件夾,包括屬於子級的文件夾,您需要實現遍歷樹子項的遞歸遍歷,適用的算法超出了此處的主題。
當然,可能還有許多其他方法可以實現類似的功能,但對於您分享的內容,這種方法似乎是最強大的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.