2011-06-14 60 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個操作。

回答

2

您可以使用String作爲標準操作,如:

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

所以你可能會得出類似

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

反正你需要消毒網頁提交的查詢只允許操作子集。你不想收到執行任意的sqlRestriction,對吧? :D因此,無論如何,代碼將變得更加複雜。

:包裝and{}or {}圍繞單個語句沒有點,你需要把它周圍的if -s整個塊。

1

我建議你看看FilterPane插件的源代碼。它的服務基本上做了你正在做的事情,並可能給你一些增強的想法。