Ошибка Scala, указывающая, что val не является членом модельного объекта, хотя это так? - PullRequest
3 голосов
/ 14 февраля 2012

Сводка: Я извлекаю список идентификаторов пользователей из таблицы транзакций участников, которая затем используется для создания списка пользователей из базы данных. Затем он используется для генерации JSON, отправляемого на страницу со списком пользователей, связанных с учетной записью.

Фон: Scala-код с использованием Squeryl на Play! Framework

Ошибка: value id is not a member of Option[models.User] при сопоставлении пользователей с генератором JSON

Код: Вот код, используемый последовательно для окончательной генерации 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
    ))))
  }

Путаница: Класс User содержит идентификатор val, который выглядит как case class User( val id: Long, etc. Я не понимаю, почему он может создать эту ошибку. Это проблема с синтаксисом или где я отображаю пользователей? Спасибо!

Ответы [ 2 ]

7 голосов
/ 14 февраля 2012

Это причина, по которой модели.User заключены в Контейнер опций (на самом деле это монада).Это все равно что пытаться вызвать метод User непосредственно в Списке пользователей, например: List(someUsers).id

В основном это означает, что это значение может быть либо Some (не нулевая оболочка), либо Nothing (точно так же, как null, нолучше).

Кроме того, лучше не использовать get в настройках, см. ссылку выше для подробностей.

2 голосов
/ 14 февраля 2012

Решил проблему.Каждый пользовательский объект был обернут в опцию вроде Some (user).Чтобы исправить это, мне пришлось использовать метод .get для каждого свойства.

def listMembers(accountId: Long) = {
    Json(generate(Account.membersToAccount(accountId)
      .map( user => Map(
      "id" -> user.get.id,
      "name" -> user.get.name,
      "username" -> user.get.emailAddress
    ))))
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...