2017-06-19 1 views
0

ich folgendes Modell haben gespeichert werden sollen:scala validate auf Modell zusätzliche Parameter, die nicht in der Datenbank

case class ProcessStepTemplatesModel(
             id: Option[Int], 
             title: String, 
             createdat: String, 
             updatedat: String, 
             deadline: Option[Date], 
             comment: Option[String], 
             stepType: Int, 
             deleted: Boolean, 
             processtemplate: Option[Int]) 

object ProcessStepTemplatesModel { 
    implicit val processStepFormat = Json.format[ProcessStepTemplatesModel] 
} 

Ich habe einen zusätzlichen Wert derived. Alle Daten werden per POST als JSON an meine Steuerung gesendet. Wenn ich die Anfrage mit dem obigen Modell validiere, ist dieser Wert verloren.

Ich brauche diesen Wert für das Modell zu arbeiten, aber es sollte nicht beibehalten werden.

Aber wenn ich den Wert zum Modell hinzufügen, erhalte ich einen Fehler von Scala Slick.

Update: enter image description here

Antwort

1

Von der Spitze von meinem Kopf, zwei Möglichkeiten für Sie:

1. Frontend Darstellung von Ihrem aktuellen Modell entkoppeln

Sie eine ProcessStepTemplatesClientModel haben könnte, welches das zusätzliche Feld derived hat und nur verwendet wird, um den JSON-Eingang in der Steuerung zu validieren. Nachdem Sie Ihre Geschäftslogik mit dem Feld derived fertiggestellt haben, konvertieren Sie das Objekt in ProcessStepTemplatesModel und speichern es in Ihrer Datenbank.

2. Fassen Sie das Feld in Ihrem * -Projektion Ihrer Slick Tisch

die abgeleitete Feld in Ihrer ProcessStepTemplatesModel Klasse einschließen (vorausgesetzt, es boolean ist, funktioniert mit jedem anderen primitiven):

case class ProcessStepTemplatesModel(
             id: Option[Int], 
             title: String, 
             createdat: String, 
             updatedat: String, 
             deadline: Option[Date], 
             comment: Option[String], 
             stepType: Int, 
             deleted: Boolean, 
             processtemplate: Option[Int], 
             derived: Boolean) 

Und da Sie als Datenbank-Mapper Slick verwenden Sie wahrscheinlich eine Tabellendarstellung für Ihre ProcessStepTemplatesModel haben:

class ProcessStepTemplatesModelTable(tag: Tag) extends Table[ProcessTableTemplatesModel](tag, "PROCESS_TABLE_TEMPLATES_MODEL") { 
    def id = column[Int]("ID", O.PrimaryKey, O.AutoInc) 
    ... 
    def processtemplate = column[Option[Int]]("PROCESSTEMPLATE") 

    def * = (id, ..., processtemplate) <> ({ 
     tuple: (Int, ..., Option[Int]) => ProcessStepTemplatesModel(tuple._1, ..., tuple._9, derived = false) 
     }, { 
     ps: ProcessStepTemplatesModel => Some((ps.id, ..., ps.processtemplate)) 
     }) 
} 

Fügen Sie das abgeleitete Feld nicht in die Tabellendefinition ein und behandeln Sie diesen Fall innerhalb der * -Projektion, indem Sie dem Fallklassenkonstruktor einen statischen Wert übergeben, um das Objekt aus dem Tupel zu erstellen, und es beim Erstellen des Tupels auslassen Objekt.

EDIT

Als Antwort auf Ihren Kommentar, eine konkrete Umsetzung der * -Projektion, bezogen auf die ProcessStepTemplatesModelderived einschließlich:

def * : ProvenShape[ProcessStepTemplatesModel] = (id.?, title, createdat, updatedat, deadline, comment, stepType, deleted, processtemplate) <> ({ 
     tuple: (Option[Int], String, String, String, Option[Data], Option[String], Int, Boolean, Option[Int]) => ProcessStepTemplatesModel(tuple._1, tuple._2, tuple._3, tuple._4, tuple._5, tuple._6, tuple._7, tuple._8, tuple._9, derived = false) 
     }, { 
     ps: ProcessStepTemplatesModel => Some((ps.id, ps.title, ps.createdat, ps.updatedat, ps.deadline, ps.comment, ps.stepType, ps.deleted, ps.processtemplate)) 
     }) 
+0

ja ich glatt bin mit. die * -Projektion sieht so aus. 'def *: ProvenShape [ProcessStepTemplatesModel] = (ID.?, Titel, Erstelldatum, Aktualisiert, Stichtag, Kommentar, Schritttyp, gelöscht, Prozesstemplate) <> ((ProcessStepTemplatesModel.apply _). tupled, ProcessStepTemplatesModel.unapply)' How würde ich den statischen Wert hinzufügen? – Felix

+1

@Felix siehe Edit – thwiegan

+0

danke, ich denke, nahe, aber ein Fehler immer noch postet ein Screenshot über – Felix

Verwandte Themen