0

我正在使用 play framework 和 slick,play framework 在表单验证中使用案例映射,但是有些值我不需要验证,因为它们不是由用户输入的,例如,完成的 ID 和日期在后端。

最后,我希望有一个像这样的课堂案例,提供给 Slick 并与我的 Table 一起使用。

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

对于 Play 的表单验证,我将提供一个单独的案例类:

case Class inputableOrder(order: String)

然后我可以创建从 inputableOrder 获取变量并将其添加到 Order 类的 Order 类吗?

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

我只是想防止重复,但我仍然需要两个不同的案例类(一个用于表单验证,另一个用于处理数据库)。

有没有办法修改现有案例 Class ,删除变量或修改变量类型?

4

1 回答 1

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);
    }
    

    这样,您可以通过提供缺少的字段来创建Orderfrom an InputableOrder,反之亦然。您需要编写一次这些辅助方法/构造函数,但是使用它们很容易。

    您还可以使用隐式方法,例如

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

    让事情变得更容易。

于 2013-07-14T17:35:34.243 回答