Я создал новый проект Grails 2.5.1 с двумя доменами и использовал функцию generate-all для создания каркаса. Один из доменов имеет много, другой домен: у пользователя много ролей. Когда я запускаю приложение, создаю нового пользователя и выбираю роль для пользователя, оно добавляет его. Я могу добавить несколько ролей для пользователя или удалить их, кроме последней. Я не могу удалить последнюю. Если я попытаюсь удалить все роли для пользователя, он проигнорирует это и оставит роли, которые были выбраны ранее. (Я обнаружил такое же поведение в Grails 2.4.4.)
Домены:
class Role {
String name
}
class User {
String name
static hasMany = [roles: Role]
}
Представление scaffolding создает поле выбора html с:
<g:select name="roles" from="${myapp.Role.list()}"
multiple="multiple" optionKey="id" size="5"
value="${userInstance?.roles*.id}" class="many-to-many"/>
Создание этого HTML:
<select id="roles" class="many-to-many" size="5" multiple="multiple" name="roles">
<option selected="selected" value="1">myapp.Role : 1</option>
<option value="2">myapp.Role : 2</option>
</select>
Воспроизвести:
- Запустите приложение
- Создайте несколько ролей
- Создайте нового пользователя, введите имя, выберите одну или несколько ролей и нажмите «Создать».
- Отредактируйте пользователя, отмените выбор ролей и нажмите «Обновить».
- Обратите внимание, что предыдущие роли по-прежнему выбраны
Я понимаю, что с формой для этого поля ничего не отправляется, если ничего не выбрано. Я могу исправить это, выполнив user.roles.clear()
перед привязкой. Это работает, но мне интересно ...
Неужели строительные леса не предназначены для этого случая? Или я что-то делаю неправильно, например, в коде моих доменов? Есть ли лучшее решение, чем редактирование строительных лесов, чтобы очистить роли перед связыванием?
belongsTo=[user:User]
в модель ролевой области. В документации есть строчка По умолчанию каскадное поведение заключается в каскадном сохранении и обновлении, но не удалении, если также не указан ownTo; Я не уверен, что это сработает, но попробовать стоит. Если это не сработает, я бы посоветовал позвонитьuser.roles.clear()
перед привязкой, как вы предложили. - person ionutab   schedule 18.08.2015