Как я могу установить ссылку на класс домена изнутри в Grails?

Здесь я столкнулся с необычной проблемой. Все должно работать в моем понимании (как новичок в grails), но не работает :(

У меня есть Пользователь класса домена. У пользователя может быть много друзей и много запросов в друзья. В классе домена есть функция для отправки запроса на добавление в друзья другому пользователю. вот код из пользовательского домена -

static hasMany = [friends: User, friendRequests: FriendRequest]
static mappedBy = [friendRequests:'receiver']

def sendFriendRequest(User toUser) {

    if(!isFriend(toUser)) {
        FriendRequest requestToSend = new FriendRequest(status:'pending', sender: this) 
        toUser.addToFriendRequests(requestToSend)
        return true
    }
    return false
}

И класс FriendRequest -

class FriendRequest {

    String status
    User sender

    static constraints = {
    status(inList:["accepted", "pending", "rejected"])
    }

    static belongsTo = [receiver:User]
}

Теперь проблема в том, что я ожидаю, что текущий объект User, из которого я запускаю функцию, будет установлен как отправитель friendRequest. Но, как ни странно, toUser, который я передаю как параметр, устанавливается как отправитель!

Может ли кто-нибудь объяснить, что мне не хватает?


person Anis    schedule 16.12.2011    source источник


Ответы (1)


Метод addToFriendRequests переопределяет отправителя. Он думает, что FriendRequest.sender - это обратное User.friendRequests

Вашему FriendRequest классу потребуются две ссылки на User: одна для отправителя и одна для получателя. Вам также нужно будет сказать горму, какой из них соответствует friendRequests отношениям. Вы можете сделать это с помощью сопоставления в вашем классе User:

static mappedBy = [friendRequests:'receiver']
person ataylor    schedule 16.12.2011
comment
Это только у меня, или мне кажется, что это не так? - person Jarred Olson; 17.12.2011
comment
Это помогает подумать о том, как отношения представлены в базе данных. FriendRequest должен иметь ссылку на идентификатор пользователя, чтобы поддерживать несколько запросов на добавление в друзья для каждого пользователя. Общее правило состоит в том, что многие стороны ссылаются на одну сторону. Карта hasMany указывает, какой класс ссылается на User, но не говорит, где хранить эту ссылку. Grails просто выбирает разумное значение по умолчанию - первого пользователя в FriendRequest. - person ataylor; 17.12.2011
comment
Привет, ataylor, Большое спасибо за быстрый ответ. Да, я уже сделал это сопоставление как static mappedBy = [friendRequests:'receiver'] И добавил рассматриваемый класс friendRequest. - person Anis; 17.12.2011