2014-01-05 1 views
0

У меня есть класс используется в приложении Play в качестве модели:Не отправлять и указать значение поля для модели

case Class1(
    id: Pk[UUID] = NotAssigned, 
    addedAt: DateTime = null 
) 

object Class1 { 
    //.... 
} 

Поле added_at имеет значение по умолчанию в БД now() и ему не может быть NULL в дБ. Но, тем не менее, когда я хочу, чтобы создать экземпляр Class1, я должен указать его, даже если я не хочу, чтобы отправить его дб, потому что он будет установлен, чтобы быть now() в дб:

Class1(addedAt = DateTime.now()) 

Использование null в значение по умолчанию кажется не разумной идеей, использование Option[DateTime] = None не имеет смысла, поскольку оно не может быть нулевым в db. Что мне делать: я хочу, чтобы он существовал в Class1, потому что он существует в db, но в то же время я не хочу его указывать, потому что он не нужен?

ответ

0

Инициализированный против неинициализированного, безусловно, одно действительное понимание значения Option и не заставляет вас вызывать , где вещь была инициализирована.

В этом случае, если вы хотите избежать недоразумений, достаточно просто переименовать значение в addedToDb - или использовать эквивалентный комментарий к документу, если переименование не является вариантом.

Я не думаю, что у кого-то была бы проблема с addedToDb, являющейся None для объекта, который еще не был добавлен в БД!

Также ... Не используйте null, это зло

+0

Но разве вы не забыли о разборе значения от db до моей модели? В db он называется «addedAt» и у него нет типа Option [DateTime], потому что он всегда присутствует (он не может быть нулевым в db). Мы используем опцию, только если значение в db имеет значение NULL. –

1

Представьте, что вы только что создали объект этого класса и не отправил его в базу данных еще. Каким будет результат (new Class1).addedAt? Вам необходимо понять, что вы не назначены, как и для id. Поскольку это не первичный ключ, нормальный способ его выражения :Option. Если вы можете гарантировать, что вы всегда работаете с объектами, которые уже отправлены в базу данных за пределами вашего уровня доступа к БД, тогда держите Option[DateTime] в своем DAL, но не используйте его непосредственно в тех частях программы, которые не должны иметь дело с он не назначен:

case class Class1DAL(..., addedAt: Option[DateTime]) 

// must ensure it is never seen with x not sent to DB 
class Class1(x: Class1DAL) { 
    def id = x.id 

    def addedAt: DateTime = 
    x.addedAt.getOrElse(throw new IllegalStateException("Class1.addedAt unassigned, which should be impossible") 
}