Я знаю, что это несколько лет, но я решил добавить обновленный ответ на этот общий вопрос.
Grails предоставляет несколько удобных инструментов, позволяющих обновлять несколько записей, используя объекты Command, ListUtils и,FactoryUtils.
Вот пример, который можно использовать для сохранения нескольких записей смены временных карт:
class ShiftEntryListCommand {
List<ShiftEntryCommand> entries = ListUtils.lazyList(
new ArrayList(), FactoryUtils.instantiateFactory(ShiftEntryCommand)
)
}
class ShiftEntryCommand {
BigDecimal totalHours
Date date
String projectName
static constraints = {
totalHours (blank: false, min: 0.00, max: 24.00, matches: /^someRegex$/)
date (blank: false, matches: /^someRegex$/)
projectName (nullable: true, blank: true, matches: /^someRegex$/)
}
}
По сути, вы создаете два объекта команды.Один для одного экземпляра данных формы, другой для списка отдельных экземпляров.Объект команды list использует ListUtils и FactoryUtils для обработки входных данных «массовой» формы, и каждый отдельный экземпляр все еще проходит проверку с ограничениями.
Вам потребуется импортировать ListUtils и FactoryUtils из коллекции общих файлов apache:
import org.apache.commons.collections.FactoryUtils
import org.apache.commons.collections.ListUtils
Он будет использоваться в таком действии:
def save(ShiftEntryListCommand cmd) {
//other action code follows ...
}
Теперь все данные массовой формы, поступающие в метод сохранения, обрабатываются и проверяются объектами команды.Чтобы сохранить записи, вы можете просмотреть список по списку и вызвать save()
для каждой из них или использовать метод Hybernate для массовых вставок.В нашем случае мы решили перебрать каждую запись.Не уверен, почему.
Надеюсь, кто-то найдет это полезным.