是否可以一次添加/更新多个实例?例如,我们有一个带有bname,tile的域类书。在gsp中,我们显示了一个具有多个bname和title fileds的表单。谁能告诉我如何编写crteate / edit动作?
答案 0 :(得分:0)
有可能。您需要创建bulkCreate / bulkUpdate页面,并附加适当的控制器和服务方法。没有什么可以阻止您在服务中执行以下操作:
def book1 = new Book(bname1, btitle1)
def book2 = new Book(bname2, btitle2)
book1.save()
book2.save()
您可能希望在那里进行验证。 bname1等是您在表单中定义的参数。
答案 1 :(得分:0)
在循环中使用上述代码,并且能够成功添加/更新记录
for(i in 0..booksSize){ def book1 =新书(bname1,btitle1) 如果(!book1.save()){ flash.message =“错误消息” } }
如果有任何行有错误/无效数据如何显示用户输入的数据以及cont / gsp中的错误?从上面我只得到最后一行错误。
答案 2 :(得分:0)
我知道这已经有几年了,但我想我会为这个常见问题添加一个更新的答案。
Grails提供了一些方便的工具,允许使用Command Objects,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来处理&#34; bulk&#34;表单输入和每个单个实例仍然使用约束进行验证。
您需要从apache commons集合中导入ListUtils和FactoryUtils:
import org.apache.commons.collections.FactoryUtils
import org.apache.commons.collections.ListUtils
它会在这样的动作中使用:
def save(ShiftEntryListCommand cmd) {
//other action code follows ...
}
现在,所有发送到save方法的批量表单数据都由命令对象处理和验证。要保存记录,您可以遍历列表并在每个列表上调用save()
或使用Hybernate方法进行批量插入。在我们的例子中,我们选择循环遍历每条记录。不知道为什么。
希望有人觉得这很有用。