#grails #grails-orm
#grails #grails-orm
Вопрос:
Интересно, является ли «belongsTo» способом записи для представления отношений собственности, где всегда есть родительский объект, но родительский объект может переключаться.
т.е. если домен владельца
class Owner {
String name
}
Должен ли дом быть:
class House {
String address
Owner owner
}
или
class House {
String address
static belongsTo = [owner: Owner]
}
Чего я хочу добиться, так это двунаправленности 1: 1, где я могу получить доступ либо к owner.house, либо к house.владелец и возможность смены владельца без удаления старого владельца.
Ответ №1:
without deleting the old owner.
?
Итак, у вас есть два варианта — безусловно, самый простой, и где ваш текущий метод на самом деле неправильный, Should House be:
может быть, это?
class House {
String address
static hasMany = [owner:Owner]
Owner currentOwner
}
С учетом существующих отношений вы говорите, что у дома много владельцев. Итак, owner1 owner2 .. и у него также есть текущий владелец, который сам является владельцем.
Каждый раз, когда вы добавляете новую запись, вы добавляете ее в коллекцию владельцев, house.addToOwner(owner)
а затем устанавливаете последнее / последнее обновление currentOwner=owner
.
Комментарии:
1. Ну, я думаю, было бы точнее сказать, что у дома есть 1 текущий владелец. Возможно, в прошлом у него были разные владельцы, но мне действительно не нужно хранить эту историю в объекте.
2.
It may have had different owners in the past, but I don't really need to store that history in the object
vsowner and ability to change the owner without without deleting the old owner
Вы могли бы создать таблицу, содержащую дом и владельца, и в которой вы регистрируете оба идентификатора как историю — затем вы можете найти и найти Allbyuser или House и повторно подключиться к объекту House или User
Ответ №2:
Если вы хотите перейти к обоим объектам, а отношение равно 1: 1, вы можете использовать hasOne
class Owner {
String name
static hasOne = [house: House]
}
class House {
String address
static belongsTo = [owner: Owner]
}