Как смоделировать дружеские отношения в Grails - PullRequest
0 голосов
/ 11 июля 2009

Как бы вы смоделировали дружеские отношения в Grails? До сих пор у моего класса User было много последователей

class User {
//Searchable plugin
static searchable = true

String userId
String password
boolean enabled = true

// For Spring Security plugin's user registration.
String email
String userRealName
boolean emailShow

Date dateCreated
Profile profile

static hasMany = [
        posts : Post,
        tags : Tag,
        following : User,
        authorities : Role,
        notifications: Notification,
        locations: Location,
        incomingLocations:IncomingLocation,

]
static belongsTo = Role


static constraints = {
    userId(blank: false, size:3..20, unique: true)
    password(blank: false)
    dateCreated()
    profile(nullable: true)
    userRealName(nullable: true, blank: true)
    email(nullable: true, blank: true)
}


static mapping = {
    profile lazy:false
}

}

Но я бы хотел изменить следующее: Пользователь для чего-то вроде дружеских отношений: создайте дружбу и создайте класс дружбы следующим образом:

class Friendship {

static belongsTo= [user:User]
User friend2
boolean areFriends

}

Это идеальная реализация?

Как бы вы осуществили рукопожатие (принять / отклонить ожидающую дружбу)?

1 Ответ

3 голосов
/ 12 июля 2009

Возможно, вам не нужно моделировать Дружбу напрямую. Вы можете просто иметь отношения hasMany, которые связывают пользователей с друзьями. Вы не создадите эти отношения, пока кто-то не примет FriendRequest. Если они больше не хотят дружить, просто удалите отношения между двумя пользователями.

class User {
    static hasMany = [friends:User]
}

class FriendRequest {
    User fromUser
    User toUser
}

Таким образом, Дружба не должна делать 2 вещи (связывать пользователей и отслеживать статусы). А друзья становятся естественными объектными отношениями, которые могут облегчить некоторые вещи, такие как оптимизация извлечения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...