1

私の Grails アプリには、1 対多の関係を持つ 2 つのドメイン クラスがあります。

class Parent    
    static hasMany = [children: Child]
}

class Child {
    Integer index
    static belongsTo = [parent: Parent]
}

index親の最初の子がインデックス 1、次の子が 2 などになるように、子が作成された相対的な順序を記録したいと思います。インデックスは連続している必要はありません。削除されますが、作成の相対的な順序を常に反映する必要があります。

indexプロパティを設定するには、次のようなことを検討しました

class Child {
    Integer index
    static belongsTo = [parent: Parent]

    def beforeValidate() {

        def maxIndex = Child.createCriteria().get {
            projections {
                max('index')
            }
            eq('parent', parent)
        }        

        this.index = maxIndex + 1 ?: 1
    }
}

Childしかしもちろん、これは 2 つの一時的なインスタンスに同じインデックスを割り当てるため、うまくいきません。indexこのプロパティを維持する最も簡単な方法は何ですか?

FWIW、他のコードが設定されないようにすることについてあまり心配していindexませんが、それを行う方法があれば、それはおまけになります。

4

4 に答える 4

1

私はあなたができると思った:

class Parent    
  List children
  static hasMany = [children: Child]
}

そして、子はリストに保持されるため、暗黙的にインデックスと順序があります。この暗黙の順序付けではなく、実際には要素にインデックスフィールドを持たせたいと思いますか?

編集

これは機能しますが(そう思われます)、インデックスをクエリするたびにデータベースにヒットします

class Child {
  def grailsApplication

  static belongsTo = [ parent: Parent ]

  Integer getIndex() {
    grailsApplication.mainContext.sessionFactory.currentSession.with { sess ->
      createSQLQuery( 'SELECT c.children_idx FROM child c where c.id = :id' )
        .setBigInteger( "id", this.id )
        .list()
        .head() + 1
    }
  }
  String toString() {
    "Child @$index"
  }
}

そしてちょっと気持ち悪いです(;_;)

編集 2

もちろん、別の選択肢は次のとおりです。

  Integer getIndex() {
    parent.children.indexOf( this ) + 1
  }
于 2012-11-15T11:51:41.423 に答える
0

自動インクリメントでIDを使用します...子が作成されると、等しいがそれ以上の別のIDを使用することはありません...作成の順序を知る必要がある場合は、IDを使用するか、次を追加できます。

class Child{
    Date dateCreated;
    static belongsTo = [parent: Parent]
}

作成日が自動的に設定され、それを使用して順序を知ることができます:)

于 2012-11-15T12:07:14.327 に答える
0

Grails の任意のドメイン クラスに対して自動的に作成された id プロパティを使用できるはずです。デフォルトでは、この値は、DB に保存される子ごとに増分されます。そう...

parent.children.sort {a,b -> a.id <=> b.id}

データベースに保存された順序で親の子を返します。

「index」という名前のプロパティが絶対に必要な場合は、次のようなことができると思います。

Integer index

static mapping = {
    id name: 'index'
}

ただし、index はおそらく多くの DB で予約語であるため、index という名前の列を持つことができず、これは失敗することに注意してください。プロパティに別の名前を付けることを検討してください。

于 2012-11-16T17:14:26.753 に答える