【问题标题】:Phoenix Ecto Model NestingPhoenix Ecto 模型嵌套
【发布时间】:2020-02-27 04:18:41
【问题描述】:

所以我想在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 字段在对象上不存在。我将如何添加这个? (如果不清楚,我也可以添加更多代码,只需评论)

【问题讨论】:

    标签: postgresql phoenix-framework ecto elixir


    【解决方案1】:

    经验法则是:如果你发现自己将某个东西命名为“对象”,那你就做错了。

    即使您提供的代码正在构建您所期望的,course.object.children 也会返回两个课程和文件夹的集合,并且没有办法抓住这个列表的头部并期望它将是一个文件夹(就像您在第 2 行中所做的那样。)此外,我们在 中的 OOP 含义中没有多态性。 Course 是一个Course,它不能也是“有点Object”。

    所以你应该单独构建一个对象的树。为此,您的 object 架构看起来不错,并且互联网上充满了如何构建树的示例。

    除了孩子,对象应该有很多课程,很多文件夹和很多课程。然后对course.object.folders 的调用(假设所有内容都已正确预加载)将按照您的要求收集文件夹

    要访问所有文件夹,包括那些属于孩子的文件夹,您需要实现递归遍历树孩子,适用的算法超出了这里的主题。

    当然,可以有许多其他方法来实现类似的功能,但对于您分享的内容,这似乎是最强大的。

    【讨论】:

      猜你喜欢
      • 2017-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多