Как сохранить несколько строк данных, выполняя цикл по массиву или карте?

#grails #groovy

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

Как вы могли заметить в разделе «работа» выше, если я могу сохранить несколько строк путем копирования, вставки и определения новых карт, но если я попытаюсь выполнить цикл по массиву, это не сработает. Есть идеи, как мне сохранить данные путем перебора массива или карты?

Есть вопросы, пожалуйста, дайте знать, спасибо

Ответ №1:

Во-первых, я не уверен насчет ["buyer.id": 2, "ref" : e.value] , я думаю, что так и должно быть [buyer: Buyer.get(2), ref : e.value] .

Во-вторых, я бы рекомендовал использовать каскадное сохранение для выполнения задачи. Вы можете попробовать что-то вроде этого (вам нужно определить 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. спасибо за ваш ответ. Я пробовал .get(), но почему-то это не сработало. Мне нужно попробовать ваше решение, и я дам вам знать, как оно работает.

2. почему вы использовали Buyer b = новый покупатель (имя: «foo») вместо def b = новый покупатель (имя: «foo»)??

3. @Wbdvlpr: определение b = новый покупатель в порядке. Я не понимаю, почему Buyer.get (buyerId) завершается с ошибкой, он по-прежнему выдает тот же результат или не может получить покупателя?

Ответ №2:

Вы должны просто уметь делать:

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

Какие ошибки (если таковые имеются) вы получаете?

Кроме того, зачем вы это делаете e.value ? В результате вы получите массив символов, а не строку (именно это используется в вашем первом рабочем примере)

Комментарии:

1. Спасибо за ваш ответ @tim, не похоже ли это решение на мое, за исключением того, что вы используете «каждый»?

2. Да, и не использовать e.value и не удалять ненужные точки с запятой и не очищать карту (для чего нет причин)

3. хм.. я новичок в groovy, и поскольку я застрял, я пробовал различные варианты, такие как очистка карты и т.д., Чтобы отсортировать ее. Мне нужно попробовать и посмотреть, как это происходит? также как я могу получить сообщение об ошибке is it .save(failOnError: true)??