Вы должны выбрать только одну из этих таблиц для хранения данных. Поскольку вы создаете отношение, вы сможете получить доступ к данным, когда вам это нужно. Например, если вы сохраняете ревизию у ученика, когда вы просматриваете сведения об ученике, вы можете сделать что-то вроде let studentDetails = await StudentDetails.find({id: id}).populate('student')
[Я называю внешний ключ как «студент», потому что он будет иметь больше смысла, когда вы будете заполнять его следующим образом]. Затем вы можете получить доступ ко всей информации из соответствующей записи учащегося, например studentDetails.student.revision
https://sailsjs.com/documentation/concepts/models-and-orm/associations/one-to- один
Очень хороший пример расширяемой структуры графика по http://www.scala-lang.org/node/124
У меня есть ты способы записать Ваш. Обратите внимание, что во всех случаях были некоторые требуемые изменения типа - т.е. параметр типа GNode должен быть ковариантным, и ConcreteGraph должен быть записан и с отличным классом узла и с типом, направляющимся в Узел.
После того, как сделанный, первый способ записать DFS состоит в том, чтобы сделать это методом (это может быть окончательным, если Вы хотите избежать виртуальной отправки наверху).
trait GNode[+Graph] {
//... functions to get edges from this vertex, etc. ...
}
trait Graph {
type Node <: GNode[Graph]
def dfs(nodeAction : Node => Unit) = print("dfsing!")
}
class ConcreteGraph extends Graph {
class CGNode extends GNode[ConcreteGraph]
type Node <: CGNode
}
new ConcreteGraph dfs {node => println("foo")}
Второе, с DFS не метод, кажется, требует просто, чтобы немного дополнительного типа, подсказывающего, использовало его.
def dfs[G <: Graph](graph : G, nodeAction : G#Node => Unit) = print("dfsing!")
dfs[ConcreteGraph](new ConcreteGraph, {node => println("foo")})
Третий путь с DFS с приправой карри. Из-за пути работает вывод типа Scala, который на самом деле приводит к более чистому интерфейсу
def dfs[G <: Graph](graph : G)(nodeAction : G#Node => Unit) = print("dfsing!")
dfs(new ConcreteGraph){node => println("foo")}
Я не вижу, почему все эти параметры необходимы. Внутренние классы в Scala (в отличие от Java) имеют типы, которые зависят от определенного экземпляра внешнего объекта. В особенности:
trait Graph {
trait Node
def dfs(n: Node) = println("DFSing!")
}
val graphA = new Graph {}
val nodeA = new graphA.Node {}
val graphB = new Graph {}
val nodeB = new graphB.Node {}
graphA.dfs(nodaA) // prints "DFSing!"
graphB.dfs(nodeB) // prints "DFSing!"
graphA.dfs(nodeB) // type mismatch; found: graphB.Node required: graphA.Node
graphB.dfs(nodeA) // type mismatch; found: graphA.node required: graphB.Node
Предоставленный, Вы не можете определить DFS за пределами графика, если Вы хотите зависеть от подчиненных типов.