18

ユーザーがドメインクラスをトラバースして、ダンプを出力できるようにしたい。私の最初の問題:次のことがうまく機能すると仮定します:

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

私が以下に言おうとしていることを書くための適切な方法は何ですか?

//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]
  }
}

上記の行はまったく機能しません。私は、ユーザーが任意のドメインクラスを選択して、「もの」で元に戻すことができるようにしようとしています。仮定:すべてのドメインクラスには、同じタイプのStuffフィールドがあります。

4

1 に答える 1

45

完全なパッケージを知っている場合は、これを使用できます。

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

パッケージを使用しない場合にも機能します。

パッケージを使用しているが、ユーザーがパッケージなしでクラス名のみを提供し、名前がすべてのパッケージで一意である場合は、次のように使用できます。

String className = "MyDomainClass"
Class clazz = grailsApplication.domainClasses.find { it.clazz.simpleName == className }.clazz
def findAThing = clazz.findByStuff(params.stuff)
于 2011-06-14T01:54:27.777 に答える