Grails 如何通过在数组或映射中循环来保存多行数据?
In-OrderController.groovyGrails 如何通过在数组或映射中循环来保存多行数据?,grails,groovy,Grails,Groovy,In-OrderController.groovy Class Buyer { String name static constraints = { } } Class Order { String ref static belongsTo = [buyer:Buyer] static constraints = { buyer(nullable:false) } } 正如您在上面的“工作”中所注意到的,如果我能够通过复制粘贴和定义新地
Class Buyer {
String name
static constraints = {
}
}
Class Order {
String ref
static belongsTo = [buyer:Buyer]
static constraints = {
buyer(nullable:false)
}
}
正如您在上面的“工作”中所注意到的,如果我能够通过复制粘贴和定义新地图来保存多行,但如果我尝试循环一个数组,它将不起作用。你知道如何通过数组或映射循环来保存数据吗
如有任何问题,请告知
谢谢您应该能够做到:
...
def someAction = {
//working
def data1 = ["buyer.id": 2, "ref": "xyz"]
def ord = new Order(data1);
ord.save();
def data2 = ["buyer.id": 2, "ref": "234xyz"]
def ord2 = new Order(data2);
ord2.save();
//But in a loop - its not working
def items = ['abc', 'def', 'ghi', 'jkl']
def data2 = [:]
for(e in items) {
data2 = ["buyer.id": 2, "ref" : e.value] //keeping buyer id same
def ord = new Order(data2);
ord.save();
data2 = [:] //just emptying it?
}
}
您收到了哪些错误(如果有)
还有,你为什么要做
e.value
?这将得到一个字符数组而不是字符串(这是您的第一个工作示例所使用的)首先,我不确定[“buyer.id”:2,“ref”:e.value]
,我认为应该是[buyer:buyer.get(2),ref:e.value]
其次,我建议使用来完成任务。您可以尝试这样的操作(您需要在Buyer for Buyer Order关系中定义一个static hasMany=[orders:Order]
关系
def someAction = {
def items = ['abc', 'def', 'ghi', 'jkl']
items.each { item ->
def ord = new Order( [ 'buyer.id':2, ref:item ] )
ord.save()
}
}
谢谢你的回答@tim,除了使用“每个”之外,这个解决方案不是有点类似于我的吗?是的,不使用
e.value
,不使用不必要的分号,不清除地图(没有理由这样做)嗯..我对groovy非常陌生,因为我被卡住了,我尝试了各种选项,如清空映射等来对它进行排序。我需要尝试一下,看看它是如何运行的?我如何得到错误消息?是否保存(failOnError:true)??谢谢你的回答。我已经尝试过了。get()但不知怎么的,它不起作用。我需要试试你的解决方案,我会让你知道它是怎么回事。为什么你用Buyer b=new Buyer(名称:“foo”)而不是def b=new Buyer(名称:“foo”)?@Wbdvlpr:def b=new Buyer没问题。我不明白为什么Buyer.get(buyerId)失败了,它仍然提供相同的结果还是无法找到买家?
Buyer b = new Buyer(name: "foo")
for(e in items) {
def ord = new Order(ref: e.value);
b.addToOrders(ord)
}
b.save(flush:true)