2012-11-13 1 views
4

Le Slick DSL permet de créer des champs facultatifs dans les tables de deux façons.Description des champs facultatifs dans Slick

Pour cette classe de cas:

case class User(id: Option[Long] = None, fname: String, lname: String) 

Vous pouvez créer un mappage de table dans l'une des façons suivantes:

object Users extends Table[User]("USERS") { 
    def id = column[Int]("id", O.PrimaryKey, O.AutoInc) 
    def fname = column[String]("FNAME") 
    def lname = column[String]("LNAME") 
    def * = id.? ~ fname ~ lname <> (User, User.unapply _) 
    } 

et

object Users extends Table[User]("USERS") { 
    def id = column[Option[Long]]("id", O.PrimaryKey, O.AutoInc) 
    def fname = column[String]("FNAME") 
    def lname = column[String]("LNAME") 
    def * = id ~ fname ~ lname <> (User, User.unapply _) 
    } 
} 

Quelle est la différence entre la deux? Est-ce que l'un ancienne façon et l'autre nouvelle façon, ou servent-ils à des fins différentes?

Je préfère le deuxième choix où vous définissez l'identité comme facultative dans le cadre de la définition de l'ID car elle est plus cohérente.

Répondre

5

L'opérateur .? dans le premier vous permet de différer le choix d'avoir votre champ facultatif au moment de définir vos projections. Parfois, ce n'est pas ce que vous voulez, mais définir votre PK comme Option est peut-être un peu drôle, car on pourrait s'attendre à ce qu'un PK soit NOT NULL.

Vous pouvez utiliser .? dans les projections supplémentaires en plus *, par exemple:

def partial = id.? ~ fname 

Ensuite, vous pouvez faire Users.partial.insert(None, "Jacobus") et ne pas se soucier de champs que vous n'êtes pas intéressé par

.
Questions connexes