2

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))
    }
  }
}
4

1 に答える 1

1

答えが得られなかったので、私は自分自身を提供します:

私が定義するケースクラスでは、次のように定義します。

case class User(id: Pk[Long] = NotAssigned,
                firstName: String,
                lastName: String,
                email: String,
                emailValidated: Boolean,
                lastLogin: DateTime,
                created: DateTime,
                modified: DateTime,
                active: Boolean) {

lazy val linkedAccounts: Seq[LinkedAccount] = DB.withConnection("test") { implicit connection =>
    SQL(
      """
        select * from linked_account la
        join users on la.user_id = users.id
        where la.id = {id}
      """
    ).on(
      'id -> id
    ).as(LinkedAccount.simple *)
  }
}

そして、次の方法でアカウントを取得します。

val linkedAccounts = user.linkedAccounts

ここでこれを見つけました

于 2013-03-22T09:58:55.390 に答える