Grails - Удаление объекта из hasMany ассоциативного списка на привязке данных?

Grails предлагает способность автоматически создать и связать объекты области со Списком hasMany, как описано в руководстве пользователя чаш Грааля.

Так, например, если мой объект области "Автор" имеет Список многих "Книжных" объектов, я мог бы создать и связать их с помощью следующей разметки (из руководства пользователя):

 
 
 

В этом случае, если какая-либо из указанных книг не будет уже существовать, то Grails создаст их и установит их заголовки соответственно. Если уже будут книги в указанных индексах, то их заголовки будут обновлены, и они будут сохранены. Мой вопрос: там некоторый простой способ состоит в том, чтобы сказать Grails удалять одну из тех книг из 'книжной' ассоциации на привязке данных?

Самый очевидный способ сделать это должно было бы опустить элемент формы, который соответствует доменному экземпляру, который Вы хотите удалить; к сожалению, это не работает согласно руководству пользователя:

Затем Grails автоматически создаст новый экземпляр для Вас в определенном положении. Если Вы "пропустили" несколько элементов в середине... Затем Grails автоматически создаст промежуточные экземпляры.

Я понимаю, что определенное решение могло быть спроектировано как часть объекта команды, или как часть конкретного контроллера - однако, потребность в этой функциональности неоднократно появляется всюду по моему приложению через несколько объектов области и для ассоциаций многих различных типов объектов. Общее решение, поэтому, было бы идеально. Кто-либо знает, существует ли что-то вроде этого включенное в Grails?

14
задан ecrane 28 April 2010 в 14:35
поделиться

1 ответ

Я только начинаю изучать Grails и увидел в вашем вопросе интересное исследовательское упражнение. Я не думаю, что вы можете использовать обычный механизм привязки данных - поскольку он заполняет пробелы, используя какую-то ленивую карту за кулисами. Таким образом, для достижения вашей цели ваш метод «save» ( или это функция? ) вряд ли будет содержать что-либо вроде:

def Book = new Book(params)

Вам нужен механизм для изменения метода «save» вашего контроллера.

После некоторого исследования я понял, что вы можете изменить свой шаблон скаффолдинга, который отвечает за генерацию кода вашего контроллера или методов выполнения.Вы можете получить копии всех шаблонов, используемых Grails, запустив « grails install-templates », а файл шаблона, который вам нужно будет изменить, называется « Controller.groovy ».

Теоретически вы можете изменить метод "save" для всего приложения таким образом.

Отлично! Вы могли подумать, что все, что вам нужно сделать сейчас, это изменить метод сохранения в шаблоне, чтобы он проходил через записи объектов (например, книги) в карте параметров, сохраняя и удаляя по мере продвижения.


Тем не менее, я думаю, что ваше решение все еще может быть довольно проблематичным. Мой инстинкт подсказывает мне, что предложенный вами механизм является плохой идеей по многим причинам.

По одной причине, неожиданно для меня, представьте, что у вас есть разбитый на страницы список книг. Может ли это означать, что ваше «сохранение» может удалить всю таблицу базы данных, кроме видимой в данный момент страницы? Хорошо, допустим, вам удалось определить, сколько элементов отображается на каждой странице, что, если список был отсортирован так, что он больше не был в числовом порядке - что вы теперь удалите?

Возможно, несколько кнопок отправки в вашей форме будут лучшим подходом (например, сохранить изменения, добавить, удалить). Я не пробовал делать такие вещи в Grails, но понимаю, что actionSubmit должен помочь вам получить несколько кнопок отправки. Я, конечно, делал такие вещи в Struts!

HTH

0
ответ дан 1 December 2019 в 10:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: