2015-12-04 4 views
7

私はScalaには新しく、私が達成しようとしていることさえもJavaで単純すぎます。私はScalaと混同します。私が欲しいものユーザを取得してすべての権限を記入してください

Userを取得し、別のクエリを使用して、彼Permission記入し、彼のRoleと彼の個別Permissionsに基づくことです。

私は、次のコードを持って知っているまで:

/** 
* Finds a user by its loginInfo. 
* 
* @param loginInfo The loginInfo of the user to find. 
* @return The found user or None if no user for the given login info could be found. 
*/ 
def find(loginInfo: LoginInfo): Future[Option[models.admin.User]] = { 

val userQuery = for { 
    dbLoginInfo <- loginInfoQuery(loginInfo) 
    dbUserLoginInfo <- Userlogininfo.filter(_.logininfoid === dbLoginInfo.id) 
    dbUser <- User.filter(_.userid === dbUserLoginInfo.userid) 
    user <- dbUser match { 
    case u => 
     val permissionQuery = for { 
     dbUserPermission <- Userpermission.filter(_.userid === u.userid) 
     dbPermission <- Permission.filter(_.id === dbUserPermission.permissionid) 
     } yield dbPermission 

     val rolePermissionQuery = for { 
     dbUserRole <- Userrole.filter(_.userid === u.userid) 
     dbRole <- Role.filter(_.id === dbUserRole.roleid) 
     dbRolePermission <- Rolepermission.filter(_.roleid === dbRole.id) 
     dbPermission <- Permission.filter(_.id === dbRolePermission.permissionid) 
     } yield dbPermission 

     val unionPermissionQuery = permissionQuery union rolePermissionQuery 

     db.run(unionPermissionQuery.result).map(_.map(_.name).toList).map { permission => 

     models.admin.User(
      UUID.fromString(u.userid.toString), 
      u.firstname.toString, 
      u.lastname.toString, 
      u.jobtitle.toString, 
      loginInfo, 
      u.email.toString, 
      false, 
      Some(permission), 
      false) 
     } 
    case None => None 
    } 
} yield user 

db.run(userQuery.result.headOption) 

} 

私は、次のエラーだ:あなたは、あなたがいることを理解する必要がyieldとするために、理解と協力たび

pattern type is incompatible with expected type; 
[error] found : None.type 
[error] required: UserDAOImpl.this.User 
[error]   case None => None 
[error]   ^
[error] play/modules/admin/app/models/daos/impl/UserDAOImpl.scala:36: value map is not a member of Object 
[error]  user <- dbUser match { 
[error]     ^
[error] play/modules/admin/app/models/daos/impl/UserDAOImpl.scala:34: type mismatch; 
[error] found : UserDAOImpl.this.Userlogininfo => slick.lifted.Query[Nothing,Nothing,Seq] 
[error] required: UserDAOImpl.this.Userlogininfo => slick.lifted.Query[Nothing,T,Seq] 
[error]  dbUserLoginInfo <- Userlogininfo.filter(_.logininfoid === dbLoginInfo.id) 
[error]      ^
[error] play/modules/admin/app/models/daos/impl/UserDAOImpl.scala:33: type mismatch; 
[error] found : UserDAOImpl.this.Logininfo => slick.lifted.Query[Nothing,Nothing,Seq] 
[error] required: UserDAOImpl.this.Logininfo => slick.lifted.Query[Nothing,T,Seq] 
[error]  dbLoginInfo <- loginInfoQuery(loginInfo) 
[error]     ^
[error] play/modules/admin/app/models/daos/impl/UserDAOImpl.scala:69: value headOption is not a member of UserDAOImpl.this.driver.DriverAction[Seq[Nothing],UserDAOImpl.this.driver.api.NoStream,slick.dbio.Effect.Read] 
[error]  db.run(userQuery.result.headOption) 
[error]       ^
[error] 5 errors found 
+1

'case u =>'はすべて一致します。 'Some'の場合はOptionを修正し、' None'のままにする場合は、 'map'を使用することができます。私は滑らかさを知らないので、他のものを手助けする方法を本当に知っていませんが、おそらくあなたが期待している型に注釈をつけて、コンパイラにあなたがどこで失敗するかを教えさせてください。 –

+1

あなたが読んでいるエラーメッセージは、あなたがそれらを厳密に読んでいれば、あなたの問題の内容をすでに伝えています。解釈が難しいという特別なエラーメッセージはありますか? –

+0

テーブルのスキーマやメソッドを与えることができれば、デバッグが容易になります。 – mohit

答えて

0

を何らかの「ラップされた」値(モナド)で作業しています。これは、FutureListOption、またはその他のモナドであることができます。

ので、パターンは種類のこのようなものです:

for { 
    someValue <- someWrappedValue() 
    someOtherValue <- someWrappedOtherValue(someValue) 
} yield someOtherValue 

あなたはFutureで作業している場合、あなたはこれらのルールを使用することができます。<-の右側に

  • すべてがなければなりませんFuture
  • <-の左側にあるすべては、「アンラップされた」値です。
  • 用-理解全体の値がFuture

に包まれyield上にあるものは何でもなりのルールがListOptionなども同じです。しかし、あなたはのために、理解と同じ以内にミックスして一致させることはできません。

matchステートメントの結果がObjectであることを示すエラーの1つは、スカラがマッチのすべてのケースで共通タイプを認識できなかったことを意味します。すべての症例でFutureを生成したいと思っています(これは、この理解のために作業しているためです)。

case None => None 

で:

私の推測では、あなたは交換する必要が

case None => Future.successful(None) 

しかし、それはより多くの情報なしで確実に知ることは難しいです。

Javaのほうが簡単であることに関して:正確ではありません。それを少し複雑にするのは言語ではなく、多くのメソッドが非同期であるという事実です。あなたがスカラーでそれを同期して実行するのであれば、Javaほど単純ではありません。しかし、結果を待っているたびにスレッドをブロックすることになります(同期呼び出しを想定しています)。

関連する問題