автоматическое увеличение целочисленного поля в Grails - PullRequest
1 голос
/ 20 января 2012

У меня есть поле int displayOrder = 1 в доменном объекте Grails, и я хотел бы увеличить его на 1 каждый раз, когда объект домена сохраняется.

Если у меня есть виджет объекта домена, который имеет отношение один-ко-многим с Pix, каждый раз, когда Widget получает новый Pix, необходимо увеличивать displayOrder.

Какой самый разумный способ настроить это? Предпочтительно отсчет должен начинаться с 1, чтобы сохранить путаницу до минимума, когда кто-то хочет изменить порядок отображения. Я думал только о дублировании идентификатора, но затем мы, возможно, смотрим на displayOrder 1123, затем 1169 и т. Д., Так что это не практичный вариант.

Коллекция Pixes, принадлежащая Widget, представляет собой отсортированный набор.

Ответы [ 2 ]

2 голосов
/ 20 января 2012

Вы также можете выполнить Именованный запрос, чтобы получить последнее максимальное значение 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, согласно вашему комментарию к @ Джарреду Олсону , вы могли бы сделать:

Pix.findAllByWidgetAndDisplayOrderGreaterThan(widget, deletedPixDisplayOrder, [sort:'displayOrder',order:'asc']).eachWithIndex { pixInstance, idx ->
    pixInstance.displayOrder = deletedPixDisplayOrder + idx
    pixInstance.save()
}
1 голос
/ 20 января 2012

Я бы предположил, что ваш код выглядит примерно так:

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)

EDIT:

Если все, что вам нужно сделать, это иметь возможность отсортировать пиксели виджета по тому времени, когда они были созданы, вы можете добавить dateCreated к пикселю. Это автоматически устанавливается Grails при создании Pix. Тогда вам не придется увеличивать / уменьшать значение при добавлении и удалении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...