2016-07-29 24 views
1

Ich brauche Hilfe beim Erstellen von Assoziation zwischen Domain-Klassen. Ich habe drei Bereiche: Benutzer, Nachrichten, Kommentare. Ein Benutzer kann viele Kommentare zu vielen Nachrichten machen. Eine Nachricht kann viele Kommentare von vielen Benutzern enthalten.GORM ASSOCIATION ERKLÄRUNG

Ich habe ein großes Problem, diese Verbindung in GORM zu implementieren.

Gorm Assocaition

Ich möchte in der Lage sein, für einen Nutzer Kommentar zu einer Nachricht hinzuzufügen. Der Kommentar sollte einen Verweis auf den Benutzer haben, der ihn erstellt hat. Und eine Nachricht sollte eine Liste aller Kommentare enthalten.

Domain Klassen:

class User { 
    String nickName 
    String password 
    Date dateCreated 
    static hasMany = [users : User, comments : Comment] 
    static hasOne = [profile : Profile] 
    //static belongsTo = [comments : Comment] 

    static constraints = { 
     profile nullable: true 
    } 
} 

class News { 

    String webTitle 
    String webPublicationDate; 
    String trailText; 
    String webUrl; 
    String thumbnail; 
    String webId; 
    static hasMany = [tags : Tag, comments : Comment] 

    static constraints = { 
    } 
} 

class Comment { 
    //static belongsTo = [news : News, user : User] 
    String content 
    int likes 
    int disLikes 
    Date lastUpdated 
    static hasOne = [user: User, news: News] 

    static constraints = { 
    } 
} 

IntegrationTests umfassen:

void "A user can add to a post's comments"(){ 
    given: "An existing user" 
    def newUser = new User(nickName: 'nickName', password: 'password').save(failOnError: true, flush : true) 

    and: "A comment and a news" 
    def news = new NewsItem(webTitle: 'I Love Hillary', webPublicationDate: new Date(), 
      trailText: 'Hillary can change America', webUrl: 'http:google.com', webId: '4', thumbnail: 'image') 

    when: 'A user adds comment to post' 
    def comm = new Comment(content: "Hillary cant be president", user: newUser, newsItem: news) 
    newUser.addToComments(comm) 
    news.addToComments(comm) 

    then: "NewsItem must have some comments" 
    news.comments.size() == 1 
    news.comments[0].user == newUser 
    newUser.comments.size() == 1 
    comm.user == newUser 
    news.comments != null 
} 

Jede Hilfe wird

+0

„meine Tests versagen“ - wie sie sind Versagen? Bitte fügen Sie Ihre fehlgeschlagenen Behauptungen hinzu, Stacktraces, ... – cfrick

+0

Ich habe das Testergebnis zur Verfügung gestellt. Danke –

Antwort

1

geschätzt würde ich lieber etwas Domainklassen ändern:

class User { 
    String nickName 
    String password 
    Date dateCreated 
    static hasMany = [users : User, comments : Comment] 
    static hasOne = [profile : Profile] 

    static constraints = { 
     profile nullable: true 
    } 
} 

class Communicate { //because News could possibly create troubles during generating controller or test classes (it's the same as singular and plural) 
    String webId; 
    String webTitle 
    String webPublicationDate; 
    String trailText; 
    String webUrl; 
    String thumbnail; 
    static hasMany = [tags : Tag, comments : Comment] 

    static constraints = { 
    } 

} 

class Comment { 
    static belongsTo = [user: User, communicate: Communicate] //read more about it: http://docs.grails.org/latest/ref/Domain%20Classes/belongsTo.html 
    String content 
    int likes 
    int disLikes 
    Date lastUpdated 

    static constraints = { 
    } 

} 

EIN Nach diesen Änderungen sollten Sie diese Tabellen wahrscheinlich neu erstellen (oder create-drop full db, wenn es sich noch in der Entwicklungsstufe befindet).

Außerdem durch Hinzufügen belongsTo Aussagen zu Kommentar sollten Sie Ihre Tests beheben (user und ‚kommunizieren‘ erhalten Sie auf create-Zeit nötig sein):

def comm = new Comment(content: "Hillary cant be president", user:user, communicate:news) 
+0

Hallo Bruder, danke für deine Antwort. Ich hätte das in meinem Beitrag erwähnen sollen. Die Nachrichten haben keine Beziehung zu einem Benutzer. Die Nachrichten sind eine eigenständige Einheit. Es wird von einer erholsamen api abgerufen. Und dann für die Benutzer angezeigt. Benutzer können dann ihre Kommentare zu diesen Nachrichten hinzufügen. Bitte aktualisieren Sie Ihre Antwort. Danke –

+0

Darüber hinaus war der Grund, warum ich die WebId von der erholsamen api gehalten. Ich habe dies implementiert, um sicherzustellen, dass ich keine doppelten Nachrichten in meiner Datenbank habe. Die webId ist ein einzigartiges Feld. Es dient nur dazu, Duplikate zu verhindern. Ich hole normalerweise die neuesten 10 Artikel. Und diejenigen, die wiederholt werden, werden eine Ausnahme auslösen, bis diejenigen, die neu sind –

+0

Ok, schau es dir an. –