J'utilise Play Framework et Squeryl pour créer une interface assez basique pour une base de données, mais je sais que je réécris trop de code. J'ai différents modèles pour représenter des données dans mon db, et ils le font tous les mêmes six fonctionsScala Data Modeling et Generics
object ModelType{
def add(model:ModelType):Option[ModelType] = Option(AppDB.tablename.insert(model))
def remove(id: Long) = AppDB.tablename.delete(id)
def getAll():List[ModelType] = from(AppDB.tablename)(model => select(model) orderBy(model.aDifferentFieldForEachModel)) toList
def toJson(model:ModelType):JsValue ={
Json.toJson(
Map("field" -> Json.toJson(model.field))
)
}
def allToJson() = {
val json:List[JsValue] = getAll.map{toJson(_)}
Json.toJson(json.toSeq)
}
def validate(different values for each model) = // is fairly different for each one. Validates the submitted fields from a user
}
Je suis en utilisant des classes de cas pour chacun des modèles, et en utilisant un objet d'accompagnement pour ces commandes. Comment puis-je utiliser des génériques ou des traits dans Scala pour faciliter ma vie et ne pas taper toutes ces méthodes à chaque fois?
EDIT: Résolu en grande partie avec la réponse de gzm0, mais le problème est maintenant de savoir comment implémenter getAll dans le trait? Je veux être en mesure d'enregistrer une variable pour chaque modèle qui ressemble à la model.aDifferentFieldForEachModel
comme ci-dessus.
J'ai donc deux problèmes, 1: Le plus important est que chacune de ces classes étendues KeyedEntitiy [Long] et je ne sais pas comment faire ModelType étendre ModelOps [T: KeyedEntity [Long]], il doesn ' J'aime cette syntaxe. Et 2: orderBy je suppose ne prend pas un prédicat et je ne peux pas trouver dans l'API exactement ce qu'il faut mais c'est quelque chose le long de la ligne de '...) (model => select (model) orderBy (model.id)) 'et je n'ai aucune idée de comment mettre cela dans un contexte générique – kingdamian42
Et 1 est fixé avec ce fil: http://stackoverflow.com/questions/8576229/scala-by-example-trait-type-parameter-with- context-bounds-erreur – kingdamian42
@ kingdamian42 Message mis à jour avec le type d'ordre (anticipé) par prédicat. – gzm0