0

私はプレイフレームワークとスリックを使用しています。プレイフレームワークはフォーム検証でケースマップを使用しますが、ユーザーが入力しないため検証する必要のない値があります。たとえば、行われた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?

繰り返しを防止しようとしているだけですが、2 つの異なるケース クラス (フォーム検証用とデータベース操作用) が必要です。

既存のケース 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);
    }
    

    このようにして、不足しているフィールドを指定Orderするだけで からを作成でき、InputableOrderその逆も可能です。これらのヘルパー メソッド/コンストラクターは 1 回記述する必要がありますが、使用するのは簡単です。

    次のような暗黙的なメソッドを使用することもできます。

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

    物事をさらに簡単にするために。

于 2013-07-14T17:35:34.243 に答える