2011-12-16 1 views
1

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

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

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] 
} 

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

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

ответ

1

Метод addToFriendRequests является переопределяющим отправителем. Он считает, что FriendRequest.sender является обратным User.friendRequests

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

static mappedBy = [friendRequests:'receiver'] 
+0

Это он или я чувствую себя испорченным? –

+0

Это помогает думать о том, как отношения представлены в базе данных. FriendRequest должен иметь ссылку на идентификатор пользователя, чтобы поддерживать несколько запросов друзей на пользователя. Общее правило - «много» сторона держит ссылку на «одну» сторону. На карте 'hasMany' говорится, какой класс связан с User, но он не говорит, где хранить эту ссылку. Grails просто выбирает разумный дефолт, первый пользователь в FriendRequest. – ataylor

+0

Привет, ателор, Большое спасибо за быстрый ответ. Да, я уже сделал это сопоставление как 'static mappedBy = [friendRequests: 'receiver']' и добавив класс friendRequest. – Anis

Смежные вопросы