如何使用Filter获取Boolean - Scala Slick

时间:2015-12-13 21:49:25

标签: scala playframework slick

我有AccountTable:

import models.{Account, Category}
import play.api.Play
import play.api.db.slick.{DatabaseConfigProvider, HasDatabaseConfig}
import slick.driver.JdbcProfile
import slick.driver.PostgresDriver.api._
import slick.lifted.Tag
import play.api.libs.json.{JsValue, Writes, Json}

object AccountTable extends AccountTable

trait AccountTable extends HasDatabaseConfig[JdbcProfile]{
  val dbConfig = DatabaseConfigProvider.get[JdbcProfile](Play.current)

  class Accounts(tag: Tag) extends Table[Account](tag, "account") {

    def id = column[Int]("id", O.PrimaryKey, O.AutoInc)

    def login = column[String]("login")

    def password = column[String]("password")

    def * = (id, login, password) <> ((Account.apply _).tupled, Account.unapply)
  }

  val accounts = TableQuery[Accounts]

  implicit val accountFormat = Json.format[Account]


  def auth(login: String, password: String): Boolean = {
    db.run(findByLogin(login, password).result.headOption)
  }

  private def findByLogin(login: String, password: String) = accounts.filter(x => (x.password === password && x.login === login))
}

我尝试开发auth方法。我真的不明白,如何完成这个方法。我尝试了不同的方法,但总是会遇到不同的错误。

1 个答案:

答案 0 :(得分:1)

选项1:

def auth(login: String, password: String): Future[Boolean] = {
  val action = findByLogin(login, password).result.headOption
    .map(authOpt => authOpt.getOrElse(false))      
  db.run(action)
}

选项2:

def auth(login: String, password: String): Boolean = {
  val action = findByLogin(login, password).result.headOption
    .map(authOpt => authOpt.getOrElse(false))           
  Await.result(db.run(action), 5 seconds)
}

上面的代码未经测试,但你应该在光滑的背后了解查询。如果在db中找不到任何结果,我认为auth应返回false

最后一句话:我强烈建议使用选项1并使用Future,因为Await.result会阻止线程执行。