Ответ Grails JSON моделей и подмоделей (один ко многим) - PullRequest
1 голос
/ 24 июля 2011

Я очень новичок в Grails и надеюсь, что у меня к вам простой вопрос.

У меня есть DomainModel, и внутри этой модели есть связанная модель (один ко многим). Скажем, Сервис и сервис как 'n' задач. Я выбираю (через findAllBy ()), например, 3 службы, и каждая служба имеет по крайней мере одну задачу или три, например.

Теперь мой вопрос. Я не хочу вернуть "render foundServices as JSON". Причина: я не хочу, чтобы люди во всем мире знали мое определение модели и некоторые, возможно, «секретные» свойства, которые все автоматически заполняются при возврате / выборе базы данных. Это правильная мысль или «слишком большая и слишком глубокая безопасность»?

Поэтому я попытался выяснить, как я могу вернуть соответствующие данные, которые мне нужны, аналогично этим объектам.

Я пытался:

List<Service> servicesSelection = Service.findAllByCompany("someCompany")
ArrayList services = new ArrayList();
for (Service service: servicesSelection) {
   ArrayList myService = new ArrayList()
   myService .add(service.id)
   myService .add(service.getServiceName())
   for (Tasks task: service.tasks) {
      ArrayList serviceTasks = new ArrayList()
      serviceTasks.add(task.id)
      serviceTasks.add(task.getTaskName())
      myService.add(serviceTasks)
   }
   services.add(myService)
}
render services as JSON

1) Это слишком много "накладных расходов"?

2) Как вы думаете, "хорошо, не имеет значения, верните всю DomainModel (из результатов поиска)"

3) Если я соберу свои собственные списки массивов, как это можно сделать, чтобы они были похожи на доменные модели, чтобы легко получить доступ ко всем свойствам и списку задач 'n' в каждой службе

Большое спасибо!

1 Ответ

1 голос
/ 25 июля 2011

Это не слишком много, если ваши требования безопасности требуют, чтобы определенная информация не передавалась.В большинстве случаев я не думаю, что это проблема - просто преобразовать весь объект домена в JSON, но ваше приложение может быть особым случаем.

Вы можете написать код, чтобы сделать это более согласованным образомс практикой Groovy / Grails:

def services = []
for (s in Service.findAllByCompany("someCompany")) {
   def tasks = []
   for (t in s.tasks) {
      tasks << [id: t.id, taskName: t.taskName]
   }
   def service = [id: s.id, serviceName: s.serviceName, tasks: tasks]
   services << service
}
render services as JSON

Я только что заметил, что ваш код также не предоставляет ключей для идентификаторов и имен (используя списки вместо карт), что, вероятно, вы захотите сделатьи что делает пример кода, который я написал.

...