23

これが私がやりたいことです:

class A {
  String string
  static constraints = {
    string(maxSize:100)
  }
}

class B extends A {
  static constraints = {
    string(url:true)
  }
}

したがって、クラス A にはいくつかの制約が必要であり、Bには同じプロパティに同じ制約と追加の制約が必要です。

私はそれを機能させることができませんでした.Table-per-Hierarchyの概念と衝突することは想像できます.

そこで、クラス B のコンストラクターで検証できるクラス B の制約を持つ Command オブジェクトを導入することで、この問題を回避しようとしました。ただし、Command オブジェクトはコントローラー内でのみ使用できるようです (grails は、.validate がないと言い続けています)。 ()そのための方法)。

だから私の質問は: grails 制約を使用してこれを解決する最もエレガントな方法は何ですか (検証を手動で再実装するのではありません)? になり得る...

  • Table-per-Sub-Class コンセプトに切り替えますか?
  • コマンド オブジェクトをドメイン クラスで動作させるにはどうすればよいですか?
  • その他の方法で?

編集:親クラスの制約を繰り返すか、親クラスに制約をまったく持たなくても、子クラスのすべての制約を定義しても問題ありません。ただし、ソリューションは、同じ親クラスの複数の子クラス (異なる制約を持つ) に対して機能するはずです。

4

4 に答える 4

7

使用できます

    class B extends A {
       static constraints = {
          importFrom A
          //B stuff
       }
    }

http://grails.org/doc/latest/ref/Constraints/Usage.htmlの状態として

于 2014-07-27T07:04:18.763 に答える
5

2.xでの方法:

制約はいくつかのConstraintsBuilderによって実行されるクロージャーなので、Bから呼び出してみます。

class B extends A { 
  static constraints = { 
    url(unique: true)
    A.constraints.delegate = delegate  # thanks Artefacto
    A.constraints()
  } 
}
于 2010-10-22T14:50:36.333 に答える
1

基本的に私はそれがどのように行われるのか分かりません。

設計上、ドメインクラスは実際にデータベーステーブルの構造をマップします。制約は実際にDB制約を生成します。したがって、同じテーブルに異なる制約を生成する複数のオブジェクトを作成しようとしています。

より良いアプローチは、制約の最も単純なサブセットを持つ1つのドメインオブジェクトを作成してから、さまざまなコマンドオブジェクトを使用して、ドメインに渡される正確な制約を微調整することだと思います。

バリデーターを使用することもできます:制約で、さまざまなオブジェクトタイプのさまざまな制約を微調整します(ドメイン内のタイプ列のようなもので、さまざまなタイプに基づいてさまざまな検証を行います)。

于 2010-10-22T15:55:22.247 に答える
-1

スーパークラスの制約は静的なclojureであるため(静的プロパティと静的メソッドは子クラスに継承されないため)、GORMによってマップされないため、再宣言する必要があります。

乾杯。

于 2011-01-10T12:25:53.657 に答える