2013-04-11 12 views
5

मेरे कार्य प्रबंधन आवेदन में, उपयोगकर्ताओं के आधार पर कार्य फिल्टर करने के लिए सक्षम होना चाहिए: assignedTo, priority, status और/या dueDateएक नियंत्रक करने के लिए पारित किया जा रहा

मैं पर कैसे यकीन नहीं है एक गतिशील क्वेरी बनाने के लिए यह उपलब्ध पैरामीटर के आधार पर एक क्वेरी तैयार करेगा।

उदाहरण के लिए:

अगर मैं एक यूआरएल जैसे कि: task/index?assignedTo=1&status=2

मैं केवल इन दो मापदंडों के आधार पर एक प्रश्न बना सकते हैं। विधि मैं करने के लिए इस्तेमाल कर रहा हूँ

Task.findAllByAssignedToAndStatus(
    User.get(params.assignedTo), 
    TaskStatus.get(params.status) 
) 

मैं स्पष्ट रूप से न हर संभव URL पैरामीटर संयोजन के लिए प्रत्येक findAllBy क्वेरी बाहर लिख कर एक सूखी विधि को लागू करना चाहते हैं।

क्या Grails में ऐसा करने का कोई अच्छा तरीका है?

+0

यह कुछ कर रही द्वारा खोजक नाम उत्पन्न करने के लिए तुच्छ है जैसे "ढूंढें सभी $ {params.collect {k, v -> k.capitalize()} .join ('और')}" ', लेकिन यह कैसे पता चलता है कि' असाइन किए गए 'को' उपयोगकर्ता 'उदाहरण लोड करना चाहिए और ' स्थिति' को 'टास्कस्टैटस' का संदर्भ देना चाहिए? –

+0

सहमत हुए, मैं ऐसा नहीं करना चाहता हूं। यह एक शोध प्रबंध के लिए है, इसलिए मैं कोड को यथासंभव स्वच्छ होना चाहता हूं। –

+0

क्या मैं एक नामित क्वेरी का सुझाव दे सकता हूं - http://grails.org/doc/2.2.1/ref/Domain%20Classes/namedQueries.html - तो आप उपयोगकर्ता और स्थिति द्वारा फ़िल्टर कर सकते हैं। मुझे लगता है कि वे चट्टान! – marko

उत्तर

5

मैं इस प्रकार यह काम कर रहे createCriteria का उपयोग कर पाने में कामयाब रहे खंड, यानी उस पैरामीटर के लिए eq() कथन।

कोड का एक टुकड़ा:

else 
    {  
     def assignedTo = Integer.parseInt(taskParams.assignedTo) 
     def priority = Integer.parseInt(taskParams.priority) 
     def status = Integer.parseInt(taskParams.status) 

     tasks = Task.createCriteria().list {    

      eq("project", Project.get(taskParams.PId)) 

      if(assignedTo > 0) 
       eq("assignedTo", User.get(assignedTo)) 

      if(priority > 0) 
       eq("priority", TaskPriority.get(priority)) 

      if(status > 0) 
       eq("status", TaskStatus.get(status))     
     }   
    } 
    return tasks 
} 
1

मैं इस के लिए खोजने योग्य प्लगइन पर विचार करूंगा (http://grails.org/plugin/searchable)। यह निर्दिष्ट करना आसान है कि Task के कौन से गुण खोजने योग्य होना चाहिए।

मैं पैरामीटर से किसी के लिए मान 0 का उपयोग कर रहा है, तो उपयोगकर्ता का चयन करता है 'सभी' कि विशेष रूप से फिल्टर के लिए है, इसलिए वह कहाँ से लोप हो जाएगा:

0

धाराप्रवाह इंटरफेस पर एक नजर डालें, तो आप जोड़ सकते हैं या (फिल्टर) प्रत्येक पैरामीटर निकालने के लिए इन का उपयोग कर सकते हैं। डोमेन वर्गों पर

http://en.wikipedia.org/wiki/Fluent_interface

7

हम लागू कर दिया है फिल्टर कार्यक्षमता यह करने के लिए। संक्षेप में आप नाम डोमेन की छोटी स्निपेट को अपने डोमेन क्लास में जोड़ दें।

उदाहरण:

class Employee { 

    String firstname 
    String lastname 
    Integer age 

    static constraints = { 
    } 

    static namedQueries = { 
     filteronFirstname { String inFirstname -> 
      if (inFirstname&& inFirstname?.size() > 0) { 
       ilike 'firstname', "%${inFirstname}%" 
      } 
     } 

     filteronLastname { String inLastname -> 
      if (inLastname && inLastname?.size() > 0) { 
       ilike 'lastname', "%${inLastname}%" 
      } 
     } 

     filteronAgeOlderThen { String ageOlderThen -> 
      if (age && age ?.size() > 0) { 
       gt 'age', ageOlderThen as Integer 
      } 
     } 

    } 
} 

यह ठीक छोटाबीजवाला फिल्टर क्षमताओं को सक्षम ताकि आप सभी फिल्टर तरीकों का उपयोग करता है 1 सूची विधि निर्माण कर सकते हैं और क्या उपयोगकर्ता इनपुट के रूप में देता है पर निर्भर करता है namedqueries एक साथ शामिल हो गए हैं।

Employee.filteronFirstname("John"). 
filterOnLastname("Doe"). 
filteronAgeOlderThen("10"). 
list(params) 
0

के लिए मेरे समाधान एक गतिशील कहाँ URL से क्वेरी:

if (params.query) { 
    def classLoader = getClass().getClassLoader(); 
    def query = new GroovyShell(classLoader).evaluate(
      "import myapp.Visit; Visit.where {$params.query}") 
    visits = query.list(params) 
} 

यह इस तरह एक यूआरएल से इसकी कमी लेता है:

visit/index?query=client.status=='suspect';atHome==false 
संबंधित मुद्दे

 संबंधित मुद्दे