tutorial comandos grails grails-domain-class servlets

comandos - grails crud



Grails: encuentra la clase de dominio por nombre (1)

Quiero permitir a los usuarios atravesar las clases de dominio e imprimir volcados de cosas. Mi problema principal: suponiendo que lo siguiente funciona bien:

//this works class EasyStuffController{ def quickStuff = { def findAThing = MyDomainClass.findByStuff(params.stuff) [foundThing:findAThing] } }

¿Cuál es la forma correcta de escribir lo que trato de decir a continuación?

//this doesn''t class EasyStuffController{ servletContext -> def quickStuff = { def classNameString = "MyDomainClass" //or params.whichOne something like that def domainHandle = grailsApplication.domainClasses.findByFullName(classNameString) //no such property findByFullName def findAThing = domainHandle.findByStuff(params.stuff) [foundThing:findAThing] } } //this also doesn''t class EasyStuffController{ servletContext -> def quickStuff = { def classNameString = "MyDomainClass" //or params.whichOne something like that def domainHandle grailsApplication.domainClasses.each{ if(it.fullName==classNameString)domainHandle=it } def findAThing = domainHandle.findByStuff(params.stuff) //No signature of method: org.codehaus.groovy.grails.commons.DefaultGrailsDomainClass.list() is applicable [foundThing:findAThing] } }

Esas líneas de arriba no funcionan en absoluto. Intento dar a los usuarios la capacidad de elegir cualquier clase de dominio y recuperar el tema con "cosas". Hipótesis: todas las clases de dominio tienen un campo Stuff del mismo tipo.


Si conoce el paquete completo, puede usar esto:

String className = "com.foo.bar.MyDomainClass" Class clazz = grailsApplication.getDomainClass(className).clazz def findAThing = clazz.findByStuff(params.stuff)

Eso también funcionará si no usas paquetes.

Si usa paquetes pero los usuarios solo proporcionarán el nombre de clase sin el paquete y los nombres son únicos en todos los paquetes, puede usar esto:

String className = "MyDomainClass" Class clazz = grailsApplication.domainClasses.find { it.clazz.simpleName == className }.clazz def findAThing = clazz.findByStuff(params.stuff)