2013-07-14 3 views
0

Я использую рамки воспроизведения и slick, play framework использует карту case в форме проверки, но есть значения, которые мне не нужны, так как они не введены пользователем, например. ID & Дата, которая была сделана, предоставляется на бэкэнд.Как совместить классные случаи?

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

case class Order(id: Long, order: String, date: Date) 

Для проверки формы Play, я бы предоставить отдельный класс случай:

case Class inputableOrder(order: String) 

Могу ли я затем создать класс Order, который будет захватывать переменные из inputableOrder и добавить его в класс Order?

case class Order(id: Long, date: Date) // <- some way to add the variable from inputableOrder? 

Я просто пытаюсь предотвратить повторение, но мне еще нужно два разных классов случае (один для проверки формы, а другой для работы с базой данных).

Есть ли способ изменить существующий класс, удалить переменную или изменить тип переменной?

+0

Я думаю, вы используете слово «тип», где вы имеете в виду «переменную», «поле», «свойство», «параметр» или «аргумент». В первом примере Order, Long, String и Date являются типами, а id, order и date - имена переменных. – Tim

+0

@Tim В основном я беспокоюсь за тип параметра, так как я не могу получить сообщение checkbox как List (даже если я делаю a для каждого и вставлять Int), потому что тип переменной класса case - Int и Проверка формы воспроизведения будет принимать сообщение только как Int, если я не использую другой класс case с другим типом, который используется Slick. – John

ответ

4

Я думаю, что у вас есть несколько вариантов здесь:

  1. InputableOrder Сделать часть Order:

    case class InputableOrder(order: String) // ... 
    case class Order(input: InputableOrder, id: Long, date: Date) // .. 
    

    Это, вероятно, самое идиоматическое решение. Но это может быть негибким, если вы позже поймете, что InputableOrder нуждается в чем-то, чего не должно быть в Order.

  2. Сделайте Order подкласс InputableOrder. В этом случае есть некоторый код с повторением при передаче аргументов в суперкласс, и суперкласс не может быть case класса, так что вы должны объявить его как обычный класс и создать вытяжку себе:

    class InputableOrder(val order: String) // ... 
    object InputableOrder { 
        def unapply(o: InputableOrder): Option[String] = Some(o.order); 
        // if you have more than one constructor arguments, return 
        // a tuple like Option[(String,String)] etc. 
    } 
    
    case class Order(override val order: String, id: Long, date: Date) 
        extends InputableOrder(order) // ... 
    

    Опять , те же проблемы могут возникать, как и в предыдущей точке.

  3. Сделать классы раздельными и создать вспомогательные методы для преобразования между ними. Выбор зависит от вашего дизайна, но я считаю, это решение будет наиболее гибким:

    case class InputableOrder(order: String); 
    case class Order(order: String, id: Long, date: java.util.Date) { 
        // An additional constructor to use when converting from Inputable: 
        def this(other: InputableOrder, id: Long, date: java.util.Date) = 
        this(other.order, id, date); 
        // Update this instance with `other`: 
        def this(that: Order, other: InputableOrder) = 
        this(other, that.id, that.date); 
    
        def toInput = InputableOrder(order); 
    } 
    

    Таким образом, вы можете создать Order из InputableOrder только путем подачи недостающих полей и наоборот. Вам нужно написать эти вспомогательные методы/конструкторы один раз, но использовать их легко.

    Вы также можете использовать неявные методы, такие как

    implicit def toInput(other: InputableOrder): Order = other.toInput; 
    

    сделать еще проще.

Смежные вопросы