2011-04-26 78 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