2012-01-20 17 views
1

Grailsドメインオブジェクトにフィールドint displayOrder = 1があり、ドメインオブジェクトが保存されるたびに1ずつインクリメントしたいと考えています。Grailsの自動インクリメント整数フィールド

ドメインオブジェクトウィジェットにPixと1対多の関係がある場合、ウィジェットが新しいPixを取得するたびに、PixはdisplayOrderをインクリメントする必要があります。

これを設定する最も賢明な方法は何ですか?誰かが表示順序を変更したいときは、混乱を最小限に抑えるために、カウントは1から始まることが望ましいです。私はIDを複製することを考えましたが、次に1123のdisplayOrder、次に1169などが考えられますので、実際の選択肢ではありません。

ウィジェットに属するPixesのコレクションは、sortedSetです。

+0

Pixの作成方法のコードを共有して、それらをウィジェットに割り当てることはできますか?ウィジェットを作成しようとしているように聞こえるように聞こえますが、最初に関連付けるPixはdisplayOrder = 1です。それに関連付ける次のpixはdisplayOrder = 2です。正しいですか? –

+0

...はい、そうです。 – vector

答えて

2

また、Pixesの最後の最大値を取得するために名前付きクエリを実行することもできます。これは、表示オーダーがスキップおよびジャンプするシナリオで機能します。その後

class Widget { 
    static hasMany = [pixes: Pix] 
    ... 
} 
class Pix { 
    static belongsTo = [widget: Widget] 

    static namedQueries = { 
     selectMaxDisplayOrderForWidget { widgetInstance -> 
      eq('widget', widgetInstance) 
      projections { 
       max('displayOrder') 
      } 
      uniqueResult = true 
     } 
    } 
    ... 
} 

def widget = retrieveOrCreateWidget() 
def pix = new Pix(propertyA: "A", ..., displayOrder: Pix.selectMaxDisplayOrderForWidget(widget).list(), widget: widget) 

あなたがそう、彼らは@Jarred Olsonへのあなたのコメントにつき、Widget用シーケンシャルで削除Pix後の表示順序番号を再初期化したい場合は、行うことができます:

Pix.findAllByWidgetAndDisplayOrderGreaterThan(widget, deletedPixDisplayOrder, [sort:'displayOrder',order:'asc']).eachWithIndex { pixInstance, idx -> 
    pixInstance.displayOrder = deletedPixDisplayOrder + idx 
    pixInstance.save() 
} 
+0

...これは本当に好きです。 – vector

1

私はあなたのコードは、このようになりますことを前提としていたい:

class Widget { 
    static hasMany = [pixes: Pix] 
    ... 
} 
class Pix { 
    static belongsTo = [widget: Widget] 
    ... 
} 


def widget = retrieveOrCreateWidget() 
def pix = new Pix(propertyA: "A", ..., displayOrder: 1, widget: widget) 
pix.save() 
widget.addToPixes(pix) 
widget.save() 

あなたがのPIXのサイズによってdisplayOrderを決定することができます。すべての場合

def widget = retrieveOrCreateWidget() 
def pix = new Pix(propertyA: "A", ..., displayOrder: widget.pixes.size() + 1, widget: widget) 

はEDITウィジェットのピクセルを作成したときにソートすることができるようにするには、dateCreatedをPixに追加する必要があります。これは、Pixが作成されると自動的にGrailsによって設定されます。次に、追加したり削除したりするときに値を増減する必要はありません。

+0

...それは私が考えていることです。また、他のPixesが削除されたときに、displayOrderを調整する必要があることが私には分かりました。私はすべての値を1ずつ減らして削除することを考えています。 – vector

関連する問題