2013-11-25 6 views
12

私はGrailsアプリケーションでかなり大きな基準クロージャを使用しており、その一部をアプリケーションのいくつかの場所で再利用したいと思います。私は再利用する必要があるセクションを複製するのではなく、これを別のクロージャーとして定義し、それが必要な場所であればどこでも参照したいと思いますが、私は構文で少し苦労しています。Grailsの基準クロージャの一部の再利用

これは単純化された/ダウンカットバージョンですが、基本的に私の基準は、次のようなものになります。私は、変数として再利用したいクロージャの一部を定義してみた

def criteriaClosure = { 
    and { 
     // filtering criteria that I'd like to reuse in lots of places 
     or { 
      names.each { name -> 
       sqlRestriction(getFilteringSql(name), [someId]) 
      } 
     } 

     if (isOrganisationChild(childDefaultGrailsDomainClass)) { 
      sqlRestriction(getFilteringSql(domain), [someArg]) 
     } 

     // filtering criteria that's specific to this particular method 
     sqlRestriction(getSomeOtherSql(), [someOtherArg]) 
    } 
} 

def criteria = domain.createCriteria() 
def paginatedList = criteria.list([offset: offset, max: max], criteriaClosure) 

をし、それを参照します私の基準クロージャでは、それが定義する制限は適用されていないようです。

def reusableClosure = { 
    and { 
     or { 
      names.each { name -> 
       sqlRestriction(getFilteringSql(name), [someId]) 
      } 
     } 

     if (isOrganisationChild(childDefaultGrailsDomainClass)) { 
      sqlRestriction(getFilteringSql(domain), [someArg]) 
     } 
    } 
} 

def criteriaClosure = { 
    and { 
     reusableClosure() //this doesn't seem to work 
     sqlRestriction(getSomeOtherSql(), [someOtherArg]) 
    } 
} 

これはかなり簡単なことでなければならないと確信しています。だから、それは不吉な質問です。何か案は?

答えて

13

私はつまり、あなたがダウンreusableClosureにデリゲートを渡すために持っていると思う:

def criteriaClosure = { 
    and { 
     reusableClosure.delegate = delegate 
     reusableClosure() 
     sqlRestriction(getSomeOtherSql(), [someOtherArg]) 
    } 
} 
+0

、おかげで働きました。 - ちなみに、なぜ「再利用可能な閉鎖」の後のかっこは必要ですか? – rcgeorge23

+1

クール:-)これはクロージャー( 'and'ブロックを基準に戻す)を呼び出すためです。 –

+0

作品、ありがとうございます! – Aston

関連する問題