2011-06-14 3 views
0
if (params.filters) { 
       def o = JSON.parse(params.filters); 
       def groupOp = o.groupOp 
       def fields = o.rules.field 
       def values = o.rules.data 
       def op = o.rules.op 
       println fields 
       println values 

       if(groupOp == "AND") { 
        fields.eachWithIndex {a, i -> 
         println op[i] 
         if(op[i].equals("eq")) { 
          and{ eq(fields[i], values[i])} 
         } 
         if(op[i].equals("ne")) { 
          and{ ne(fields[i], values[i])} 
         } 
         if(op[i].equals("ge")) { 
          def valu = Double.valueOf(values[i]); 
          and{ ge(fields[i], valu)} 
         } 
        } 
       } 
       if(groupOp == "OR") { 
        fields.eachWithIndex {a, i -> 
         println op[i] 
         if(op[i].equals("eq")) { 
          println 'eq'; 
          or{ eq(fields[i], values[i])} 
         } 
         if(op[i].equals("ne")) { 
          println 'ne'; 
          or{ ne(fields[i], values[i])} 
         } 
         if(op[i].equals("ge")) { 
          def valu = Double.valueOf(values[i]); 
          or{ ge(fields[i], valu)} 
         } 
        } 
       } 
      } 

여기에서 params.filters은 JSON 텍스트를 따르고 있습니다.GORM의 기준 구축

{ 
    "groupOp":"OR", 
    "rules":[ 
     { 
     "field":"foo1", 
     "op":"le", 
     "data":"9.5" 
     }, 
     { 
     "field":"foo2", 
     "op":"eq", 
     "data":"12345-123" 
     }, 
     { 
     "field":"foo3", 
     "op":"cn", 
     "data":"IDM" 
     } 
    ] 
} 

이 데이터는 JQuery 데이터 그리드에서 가져옵니다.

더 좋은 방법이 있나요? 코드에서 나는 단지 3 개의 연산자만을 나열했지만 실제로는 14 개의 연산이 있습니다. 에만 허용 당신은 웹 제출 된 쿼리를 소독해야합니다 그래서 당신은 어쨌든

A.withCriteria { 
    (groupOp) { 
     for (???) { 
      (op[i]) (fields[i], parsedVals[i]) 
     } 
    } 
} 

처럼 뭔가 올 수도

A.withCriteria { 
    'eq' (id, 1) 
} 

:

답변

2

당신은 같은 기준 작업으로 문자열을 사용할 수 있습니다 하위 집합. 임의의 끝을 sqlRestriction 실행하고 싶지 않으십니까? : D 그래서 코드는 어쨌든 더 복잡 할 것입니다.

: 단일 문 주위에 and{} 또는 or {} 포장은 아무 소용이 없습니다, 당신은 if -s의 전체 블록 주위를 넣어해야합니다.

1

FilterPane 플러그인의 소스 코드를 살펴 보는 것이 좋습니다. 그 서비스는 본질적으로 당신이하고있는 일이며 향상을위한 아이디어를 줄 것입니다.