2011-04-26 31 views
0

我正在使用Grails 1.3.7。假设我有域对象FooBarFoo酒吧有一个列表面条实例。在NoodleControllerFooController的BarController,我有一个fetchNoodles行动返回的记录列表JSON,这样从各种来源返回相同的JSON记录列表

NoodleController

def fetchNoodles = { 
    List data = [] 
    for(noodle in Noodle.list()) 
    data.add([noodle.id, noodle.name, noodle.stuff] 

    render data as JSON 
} 

FooController的

def fetchNoodles = { 
    List data = [] 

    foo = Foo.get(params.id) 
    if (foo) { 
    for(noodle in foo.noodles()) 
     data.add([noodle.id, noodle.name, noodle.stuff] 
    } 

    render data as JSON 
} 

BarController

def fetchNoodles = { 
    List data = [] 

    bar = Bar.get(params.id) 
    if (bar) { 
    for(noodle in bar.noodles()) 
     data.add([noodle.id, noodle.name, noodle.stuff] 
    } 

    render data as JSON 
} 

问题

  • 我怎样才能避免重复3次同样的代码?
  • 如何将筛选添加到这些列表提取操作,仍然没有重复自己?

回答

1

只需将其移动到NoodleService即可。然后,在BarController,做这样

def noodleService 

def fetchNoodles = { 
    List data = noodleService.getNoodles(Bar.get(params.id)?.noodles) 
    render data as JSON 
} 

noodleService.getNoodles(Bar.get(params.id)?.noodles, { it.name =~ /A.+/ })) 

如果我们检索noodles收集后谈论过滤。如果您需要在数据库级过滤noodles,则需要以不同的方式访问它们,如:

noodleService.getNoodles([barId: params.id], params.subMap(
    ['order', 'sort', 'max', 'offset', 'whatever-filter-field-names-here'])) 

NoodleService.getNoodles(Map criteriaFields, Map filterFields)查询noodles一个标准。

+0

只是真棒,完美,使代码漂亮^^ – Monkey 2011-04-26 09:44:57