-1

わかりました、ここにいるすべての人のために時間を節約したかったのですが、それは最も賢明な方法ではなかったと思います. だからここで私は私がやっていることを手に入れました。私は聖杯の世界に生まれたばかりなので、ゆっくりしてください。私のアプローチが大丈夫か、またはよりスマートな方法があるかどうかを教えてください。

abc と def の 2 つのテーブルがあります。いくつかのルールに基づいて、データを abc から def に移動したいと考えています。私のプロジェクトでは、将来そのようなケースがいくつかあると予想しています(テーブル klm と xyz、pqr と jkl などのマッピング)。したがって、一般化が必要です)。

クラス Abc と Def を以下に示します。

class Abc {

String firstAbc
String secondAbc

static constraints = {
    firstAbc(nullable:true)
    secondAbc(nullable:true)
}
}

class Def {

String fieldA
String someRandomField

static constraints = {

}
}

以下に示す Mappings というドメイン クラス (今後のすべてのマッピングの親として機能する) を作成しました。

class Mappings {

String inputTable // in this case this will be abc
String inputField // can be firstAbc or secondAbc
String inputValue // some value

String outputTable // def in this case
String outputField // either of fieldA or someRandomField
String outputValue
}

次に、Mappings を拡張して、以下に示す AbcDefMapping という特定のインスタンスを作成しました。

class AbcDefMapping extends Mappings {
}

abc を def にマッピングするためのルールは、AbcDefMapping に格納されます。そのようなルールの 1 つは、abc.firstAbc が「jack」の場合、「jacky」を def.fieldA に保存することです。この場合のマッピングの値は、inputTable = abc inputField = firstAbc inputValue = "jack" outputTable = def outputField = fieldA outputValue = "jacky" になります。</p>

必要な処理を行う transform() というメソッドを Controller.groovy に追加したいので、将来はドメイン クラスを作成し、クラスをマッピングして、コントローラーを生成します。これは、これまでのところ、私の変換方法がどのように見えるかです。しかし、当面の問題を解決するまで、これ以上進むことはできません。この問題を解決できれば、次のステップに進むことができるかもしれません。ご存知のように、ここ数日は苦労しました

def transform(){
    def csplit = []
    def count = 0
    for (i in ${className}){
        if (i == i.toUpperCase() && count!=0){
            csplit.add(count)

        }
        count++
    }
    def inputs = ${className.substring(0,3)}.list() // here instead of manually inserting 3, I need to insert csplit[0].length
    def inputTable = ${className}.substring(0,1).toLowerCase() + ${className}.substring(1,3) //replace 3 with csplit[0].length
    def mappings = ${className}.executeQuery(" from ${className} acm  where acm.inputTable = '" + inputTable + "'  order by acm.inputField, acm.inputValue, acm.outputField, acm.outputValue")
    println mappings


}
4

1 に答える 1

0

テンプレートは実質的にController.groovy巨大な文字列です。つまり、すべて${}が評価され、文字列に置換されます。

実際に何をしようとしているのかを推測するのは困難です。現在持っているもの:

def f = 5
def inputs = ${className.substring(0,f)}.list()

それに一致するコードを生成しようとしますが、変数はなく、生成されたコントローラーで最終的にf読み取られる文字列のみです。def f = 5value を実際に使用する5と、GString 内の式が正しく評価されます。

于 2012-09-05T16:42:47.277 に答える