UserとLinkedAccountの間には1対多の関係があり、ユーザーは複数のリンクされたアカウントを持つことができます。
LinkedAccountとそのユーザーをLinkedAccount(id, provider_user_id, salt, provider_id, auth_method, avatar_url, User.findBy(user))
パーサーで実行することで問題はありません。
私が理解できないのは、LinkedAccountsを使用してユーザーをロードする方法です。LinkedAccountsをユーザーに知らせる必要があると思いますが、どうすればよいでしょうか。
ユーザーが指定されたタイプのリンクされたアカウントを持っているかどうかを確認するたびに、dbへの余分なSQL呼び出しを1つ取り除くためにこれを実行したいと思います。現在、私はこれが好きです:
def findLinkedAccountByUserAndProvider(userId: Pk[Long], providerId : String) = {
DB.withConnection {
implicit connection =>
SQL("select * from linked_account la where la.user_id = {userId} and la.provider_id = {providerId}")
.on("userId" -> userId, "providerId" -> providerId).as(LinkedAccount.simple.singleOpt)
}
}
または、ユーザーがLinkedAccountsを認識し、LinkedAccountがユーザーを認識している場合、これにより問題が発生しますか?
ユーザー:
case class User(id: Pk[Long] = NotAssigned,
firstName: String,
lastName: String,
email: String,
emailValidated: Boolean,
lastLogin: DateTime,
created: DateTime,
modified: DateTime,
active: Boolean)
object User {
val simple = {
get[Pk[Long]]("id") ~
get[String]("first_name") ~
get[String]("last_name") ~
get[String]("email") ~
get[Boolean]("email_validated") ~
get[DateTime]("last_login") ~
get[DateTime]("created") ~
get[DateTime]("modified") ~
get[Boolean]("active") map {
case id ~ first_name ~ last_name ~ email ~ email_validated ~ last_login ~ created ~ modified ~ active =>
User(id, first_name, last_name, email, email_validated, last_login, created, modified, active)
}
}
}
LinkedAccount:
case class LinkedAccount(id: Pk[Long] = NotAssigned,
providerUserId: String,
salt: Option[String],
providerId: String,
authMethod: Option[String],
avatarUrl: Option[String],
user: User
)
object LinkedAccount {
val simple = {
get[Pk[Long]]("id") ~
get[String]("provider_user_id") ~
get[Option[String]]("salt") ~
get[String]("provider_id") ~
get[Option[String]]("auth_method") ~
get[Option[String]]("avatar_url") ~
get[Pk[Long]]("user_id") map {
case id ~ provider_user_id ~ salt ~ provider_id ~ auth_method ~ avatar_url ~ user =>
LinkedAccount(id, provider_user_id, salt, provider_id, auth_method, avatar_url, User.findBy(user))
}
}
}