对于我的项目,我想创建一个树模型;假设它是关于文件和目录的。但是文件可以同时在多个目录中,所以更像是你在gmail中给电子邮件添加标签的方式。我想为能力(比如java、scala、angular等)建立一个模型,并将它们归类。在这种情况下,java和scala是语言,agila和scrum是工作方式,angular是一个框架/工具包等等。但是我们想要灵活地分组,比如play、java和scala属于“后端”类别,angular、jquery等等属于前端类别。
我想我应该有这样一张能力表:
case class Competence (name: String, categories: Option[Category])分类如下:
case class Category ( name: String, parent: Option[Category] )这将编译,但SORM将生成一个错误(从激活器控制台):
scala> import models.DB
import models.DB
scala> import models.Category
import models.Category
scala> import models.Competence
import models.Competence
scala> val cat1 = new Category ( "A", None )
cat1: models.Category = Category(A,None)
scala> val sav1 = DB.save ( cat1 )
sorm.Instance$ValidationException: Entity 'models.Category' recurses at 'models.Category'
at sorm.Instance$Initialization$$anonfun$2.apply(Instance.scala:216)
at sorm.Instance$Initialization$$anonfun$2.apply(Instance.scala:216)
at scala.Option.map(Option.scala:146)
at sorm.Instance$Initialization.<init>(Instance.scala:216)
at sorm.Instance.<init>(Instance.scala:38)
at models.DB$.<init>(DB.scala:5)
at models.DB$.<clinit>(DB.scala)
... 42 elided虽然我想要sorm的简单美观,但我的项目是否需要切换到Slick来实现它?我的想法是链接表将由sorm隐式生成。或者,我是否可以简单地通过以下方式解决这个问题:
case class Taxonomy ( child: Category, parent: Category )然后在JS端做解析/格式化工作吗?它似乎使使用sorm的简单性在某种程度上消失。
为了给出一些想法,我想要做一个ajaxy页面,用户可以在左边的列表中添加新的能力,然后将它们链接/取消链接到树中他喜欢的任何类别标签。
发布于 2016-07-14 16:36:45
我遇到了同样的问题。我需要定义两个运算符之间的交互,它可以链接(递归)。像这样:
case class InteractionModel(
val leftOperantId: Int,
val operation: String ,
val rightOperantId: Int,
val next: InteractionModel)我的解决办法:将这个case类更改为Json(String)并将其持久化为String,当检索到它时,将其从Json转换。由于它是字符串,所以不要将其注册为sorm实体。
import spray.json._
case class InteractionModel(
val leftOperantId: Int,
val operation: String ,
val rightOperantId: Int,
val next: InteractionModel) extends Jsonable {
def toJSON: String = {
val js = this.toJson(InteractionModel.MyJsonProtocol.ImJsonFormat)
js.compactPrint
}
}
//define protocol
object InteractionModel {
def fromJSON(in: String): InteractionModel = {
in.parseJson.convertTo[InteractionModel](InteractionModel.MyJsonProtocol.ImJsonFormat)
}
val none = new InteractionModel((-1), "", (-1), null) {
override def toJSON = "{}"
}
object MyJsonProtocol extends DefaultJsonProtocol {
implicit object ImJsonFormat extends RootJsonFormat[InteractionModel] {
def write(im: InteractionModel) = {
def recWrite(i: InteractionModel): JsObject = {
val next = i.next match {
case null => JsNull
case iNext => recWrite(i.next)
}
JsObject(
"leftOperantId" -> JsNumber(i.leftOperantId),
"operation" -> JsString(i.operation.toString),
"rightOperantId" -> JsNumber(i.rightOperantId),
"next" -> next)
}
recWrite(im)
}
def read(value: JsValue) = {
def recRead(v: JsValue): InteractionModel = {
v.asJsObject.getFields("leftOperantId", "operation", "rightOperantId", "next") match {
case Seq(JsNumber(left), JsString(operation), JsNumber(right), nextJs) =>
val next = nextJs match {
case JsNull => null
case js => recRead(js)
}
InteractionModel(left.toInt, operation, right.toInt, next)
case s => InteractionModel.none
}
}
recRead(value)
}
}
}
}https://stackoverflow.com/questions/37592020
复制相似问题