如何通过循环数组或映射来保存多行数据?

时间:2011-04-06 08:33:09

标签: grails groovy

Class Buyer {
   String name
   static constraints = {
   }
}
Class Order {
    String ref
    static belongsTo = [buyer:Buyer]
    static constraints = {
    buyer(nullable:false)
    }
}

在OrderController.groovy

...
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?
  }
}

正如您在上面的“工作”中所注意到的,如果我能够通过复制粘贴和定义新地图来保存多行但是如果我尝试循环遍历数组,则它不起作用。任何想法如何通过循环数组或地图来保存数据?

如有任何问题,请告知 感谢

2 个答案:

答案 0 :(得分:2)

首先,我不确定["buyer.id": 2, "ref" : e.value],我认为它应该是[buyer: Buyer.get(2), ref : e.value]

其次,我建议使用cascading save来完成任务。您可以尝试这样的事情(您需要在买方中为买方订单关系定义static hasMany = [orders: Order]关系。

Buyer b = new Buyer(name: "foo")
for(e in items) {
     def ord = new Order(ref: e.value);
     b.addToOrders(ord)
  }

b.save(flush:true)

答案 1 :(得分:0)

你应该能够做到:

def someAction = {
  def items = ['abc', 'def', 'ghi', 'jkl']
  items.each { item ->
     def ord = new Order( [ 'buyer.id':2, ref:item ] )
     ord.save()
  }
}

你得到了什么错误(如果有的话)?

另外,你为什么要做e.value?这将为您提供一个Character而不是String的数组(这是您的第一个工作示例正在使用的)