Podsumowanie: pobieram listę identyfikatorów użytkowników z tabeli transakcji członków, która jest następnie używana do generowania listy użytkowników z bazy danych. Jest to następnie wykorzystywane do generowania kodu JSON wysyłanego do strony zawierającej listę użytkowników powiązanych z kontem.

Tło: kod Scala przy użyciu Squeryl w Play! Struktura

Błąd: value id is not a member of Option[models.User] podczas mapowania użytkowników do generatora JSON

Kod: oto kod używany kolejno do ostatecznego wygenerowania JSON

def memberIds(accountId: Long) = { from(DB.members)(m =>
      where(m.accountId === accountId)
        select (m)).map(_.userId).toSet
  }

def membersToAccount(id: Long) = {
    memberIds(id).map( i => models.User.get(i))
  }

def listMembers(accountId: Long) = {
    Json(generate(Account.membersToAccount(accountId)
      .map(user => Map(
      "id" -> user.id,
      "name" -> user.name,
      "username" -> user.username
    ))))
  }

Zamieszanie: klasa User zawiera identyfikator, który wygląda jak case class User( val id: Long, itp. Nie rozumiem, dlaczego spowodowałby to ten błąd. Czy to problem ze składnią lub gdzie mapuję użytkowników? Dziękuję!

3
crockpotveggies 14 luty 2012, 11:27

2 odpowiedzi

Najlepsza odpowiedź

To jest powód, dla którego models.User jest zapakowany w kontener opcji (właściwie to jest to monada). To jak próba wywołania metody User bezpośrednio na Liście użytkowników, np.: List(someUsers).id

Zasadniczo oznacza to, że tą wartością może być Some (opakowanie nie zerowe) lub Nothing (tak jak null, ale lepiej).

Co więcej, lepiej nie używać get w opcjach, rozważ powyższy link, aby uzyskać szczegółowe informacje.

7
Community 23 maj 2017, 15:13

Rozwiązał problem. Każdy obiekt użytkownika został opakowany w opcję typu Some(user). Aby to naprawić, musiałem użyć metody .get na każdej właściwości.

def listMembers(accountId: Long) = {
    Json(generate(Account.membersToAccount(accountId)
      .map( user => Map(
      "id" -> user.get.id,
      "name" -> user.get.name,
      "username" -> user.get.emailAddress
    ))))
  }
2
crockpotveggies 14 luty 2012, 11:54