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