2011-03-09 2 views
0

У меня есть класс домена пользователя и список.Grails/GORM: Каков правильный/лучший способ сопоставить эти два домена?

В каждом списке должен быть автор (пользователь), и каждый пользователь должен иметь «основной список». Только некоторые из списков будут иметь статус «primaryList».

Так .. Somthing как

 User: 
    List primaryList 

List: 
    User author 

    static belongsTo = User 

Конечно это не работает, как предполагалось, потому что два отношения ошибочно принимается только один. Я также должен добавить hasMany в User, а другой - для List ..., но я не хочу усложнять этот пример, потому что хочу получить правильный ответ от вас.

+0

может список "hasMany" пользователей? –

+0

@ Закрыть список принадлежит только пользователю. – cripox

ответ

3

Возможно, вам понадобится использовать mappedBy, чтобы объяснить, как появятся поля в списке «Пользователь и список». Вот несколько доменов, которые я написал, которые позволяют пользователю создавать множество списков, но только один должен быть «основным». Есть несколько дополнительных ограничений с возможностью NULL, поэтому вы можете использовать пользовательский интерфейс для лесов, не попадая в сценарий с курицей и яйцом.

class User { 
    String name 
    FooList primaryList 

    static hasMany = [authoredLists: FooList] 

    static mappedBy = [primaryList: 'primaryOwner', authoredLists: 'author'] 

    static constraints = { 
     primaryList nullable: true, unique: true 
     authoredLists nullable: true 
    } 

    String toString() { name } 
} 

Я назвал этот класс "FooList" просто чтобы избежать путаницы со стандартным классом List:

class FooList { 
    static belongsTo = [author: User, primaryOwner: User] 

    static constraints = { 
     primaryOwner nullable: true, display: false 
    } 
} 
+0

Не могу ли я иметь в FooList только одну ссылку пользователя - «автор»? Поскольку список не может иметь автора и быть основным списком для другого пользователя. И тогда мне нужен только однонаправленный знак от пользователя, чтобы узнать, какой список является его основным списком (он может быть в authoredLists или нет) ... Из-за ограничений по времени я решил это, поставив пользователю Integer primaryListId вместо FooList поле ... но я хочу реорганизовать его, потому что он уродлив. – cripox

2

Попробуйте использовать карту belongsTo подход:

static belongsTo = [user:User] 

Тем путем Grails должны увидеть 2 свойства в отдельности.

+0

попробовал это, на самом деле мой рабочий пример более сложный, но я хотел бы видеть, как другие это сделают. – cripox

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