从各种来源返回相同的JSON记录列表

时间:2011-04-26 08:57:50

标签: ajax grails

我正在使用Grails 1.3.7。假设我有域对象 Foo Bar Foo Bar 都有一个 Noodle 实例列表。在 NoodleController FooController BarController 中,我有一个 fetchNoodles 动作,它返回一个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 个答案:

答案 0 :(得分: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中使用条件。