2015-11-20 1 views
0

Я строю REST api с grails 3 и mongo. Я столкнулся с проблемой, когда мне нужно маршалировать граф объектов с большей глубиной.Есть ли способ контролировать отношения загрузки в gorm с mongodb?

У меня есть следующие домены:

class Category extends Resource { 
    /* other fields */ 

    Category parent 
} 

class Product extends Resource { 
    /* other fields */ 

    List<Category> categories 
    static hasMany = [categories: Category] 
} 

У меня есть в базе данных следующей структура (упрощенный для понимания):

categories: 
{name: 'cat1'} 
{name: 'cat2', parent: 'cat3'} 
{name: 'cat3', parent: 'cat4'} 
{name: 'cat4', parent: 'cat5'} 
{name: 'cat5'} 

product: 
{categories: ['cat1', 'cat2']} 

Я простирающийся от RestfullController при создании своих контроллеров , Я хочу иметь возможность получить продукт и иметь категории с родителями в возвращенном json.

Я получаю следующие результаты:

/product/${id} 
{ 
    id: '...', 
    categories: [{ 
     id: '...', 
     name: 'cat1' 
    }, { 
     id: '...', 
     name: 'cat2', 
     parent: { id: '...' } 
    }] 
} 

/category/cat2id 
{ 
    id: '...', 
    name: 'cat2', 
    parent: { id: '...' } 
} 

/category 
[{ 
    id: '...', 
    name: 'cat1' 
},{ 
    id: '...', 
    name: 'cat5' 
},{ 
    id: '...', 
    name: 'cat4', 
    parent: { 
     id: '...', 
     name: 'cat5' 
    } 
},{ 
    id: '...', 
    name: 'cat3', 
    parent: { 
     id: '...', 
     name: 'cat4', 
     parent: { 
      id: '...', 
      name: 'cat5' 
     } 
    } 
},{ 
    id: '...', 
    name: 'cat2', 
    parent: { 
     id: '...', 
     name: 'cat3', 
     parent: { 
      id: '...', 
      name: 'cat4', 
      parent: { 
       id: '...', 
       name: 'cat5' 
      } 
     } 
    } 
}] 

Почему Category.list() загружать всю категорию графа объектов, и Category.get(), Product.get() и Product.list() будет не загружать? Есть ли способ контролировать это поведение?

ответ

0

То, как работает Grails, заключается в том, что он будет отображать ассоциации, которые уже были загружены из базы данных, поэтому вы получаете некоторые ассоциации, а другие нет.

Нет встроенного способа контроля этого поведения, кроме как написать собственный маршаллер. См. http://grails.github.io/grails-doc/latest/guide/webServices.html#renderers