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)