我在Grails域对象中有字段int displayOrder = 1
,并希望每次保存域对象时将其递增1。
如果我有与Pix有一对多关系的域对象Widget,每次Widget获得一个新的Pix时,Pix需要增加displayOrder。
最谨慎的做法是什么?优选地,count应该从1开始,以在有人想要改变显示顺序时将混淆保持为最小。我想只是重复ID,但是我们可能会看到1123的displayOrder,然后是1169等等,所以这不是一个实用的选择。
属于Widget的Pixes集合是一个sortedSet。
答案 0 :(得分: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)
如果您想在删除Pix
之后重新初始化显示订单号,那么它们对于Widget
是连续的,根据您对@Jarred Olson的评论,您可以执行以下操作:
Pix.findAllByWidgetAndDisplayOrderGreaterThan(widget, deletedPixDisplayOrder, [sort:'displayOrder',order:'asc']).eachWithIndex { pixInstance, idx ->
pixInstance.displayOrder = deletedPixDisplayOrder + idx
pixInstance.save()
}
答案 1 :(得分: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()
您可以通过像素的大小来确定displayOrder:
def widget = retrieveOrCreateWidget()
def pix = new Pix(propertyA: "A", ..., displayOrder: widget.pixes.size() + 1, widget: widget)
编辑:
如果你需要做的就是能够在创建Widget的像素时对它们进行排序,你可以将dateCreated
添加到Pix。创建Pix时,Grails会自动设置此项。然后,在添加和删除时,您不必增加/减少该值。