我有一个想法Scala的油滑我的数据访问层应该如何的样子,但我不知道是否真的有可能。
假设我有一个有一个像ID,电子邮件,密码等常用的字段中输入用户表
object Users extends Table[(String, String, Option[String], Boolean)]("User") {
def id = column[String]("id", O.PrimaryKey)
def email = column[String]("email")
def password = column[String]("password")
def active = column[Boolean]("active")
def * = id ~ email ~ password.? ~ active
}
我想查询他们以不同的方式,目前的丑陋的方式就是有一个新的数据库会话,做的理解,然后做不同的if语句来达到我想要的。
如
def getUser(email: String, password: String): Option[User] = {
database withSession { implicit session: Session =>
val queryUser = (for {
user <- Users
if user.email === email &&
user.password === password &&
user.active === true
} //yield and map to user class, etc...
}
def getUser(identifier: String): Option[User] = {
database withSession { implicit session: Session =>
val queryUser = (for {
user <- Users
if user.id === identifier &&
user.active === true
} //yield and map to user class, etc...
}
我宁愿是有用于查询的私有方法,然后沿的线条定义查询的公共方法
type UserQuery = User => Boolean
private def getUserByQuery(whereQuery: UserQuery): Option[User] = {
database withSession { implicit session: Session =>
val queryUser = (for {
user <- Users
somehow run whereQuery here to filter
} // yield and boring stuff
}
def getUserByEmailAndPassword(email, pass){ ... define by query and call getUserByQuery ...}
getUserById(id){….}
getUserByFoo{….}
通过这种方式,查询逻辑封装在相关的公共职能和实际查询和映射到用户对象是可重复使用的功能,其他人不需要去关注。
我的问题是试图重构“其中”比特就是到功能,我可以绕过。 试图做这样的事情在的IntelliJ选择它们并使用重构导致一些非常疯狂的打字怎么回事。
有没有人有他们可以做展示接近我所要达到的任何例子吗?