2012-02-14 1 views
3

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

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

Ошибка: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 
    )))) 
    } 

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

ответ

7

Это причина моделей. Пользователь обернут в Option container (фактически, это монада). Это похоже на попытку вызвать метод пользователя непосредственно на список пользователей, как: List(someUsers).id

В основном это означает, что это значение не может быть Некоторые из них (не нулевой обертка) или ничего (так же, как null, но лучше).

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

+0

LOL Я отправил свое исправление через 9 секунд после вашего ответа. Тем не менее, я соглашусь с вами, потому что я ценю лучшую технику, и я исправлю код после того, как прочитаю вариант еще немного. Благодаря! – crockpotveggies

2

Решил проблему. Каждый пользовательский объект был обернут опцией Some (пользователь). Поэтому, чтобы исправить это, мне пришлось использовать метод .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 
    )))) 
    }