2013-11-22 35 views
0

我有一個查詢頁面,此頁面可以選擇類別和子類別,同時創建新的查詢。例如:如何使用Grails保存數據庫中的類別和相關子類別

Main Category 
Sub Category 
Sub Category 
Sub Category 

Main Category 
Sub Category 
Sub Category 
Sub Category 

Main Category 
Sub Category 
Sub Category 
Sub Category 

用戶可以從查詢頁面中選擇多個類別和子類別。

以下是域歸類相關類別和子類別:

Category.groovy

class Category { 

    String name 
    String description 
    static constraints = { 
    } 
    static hasMany = [ subCategories: SubCategory ] 

} 

SubCategory.groovy

class SubCategory { 

     String name 

     static hasMany = [requirements: Enquiry] 
     static belongsTo = [ category: Category] 
     static constraints = { 
      requirements nullable:true 
     } 
    } 

注:以下域用於保存選定的類別和子類別從查詢頁面。

class RegisteredCategories { 

    Enquiry enquiry 
    Category category 

    static constraints = { 

    } 

    static hasMany = [ subCategories: SubCategory ] 
} 

GSP模板,查詢頁面上顯示的類別和子類別:

<g:each in="${marketlist}" status="j" var="category"> 
    <g:hiddenField id="${j}" name="catId.${category.id}" value="${category?.id}" /> 
     <DIV class="market-name"> 
     <p>${category.name}</p> 
     </DIV> 
     <g:each in="${category.subCategories}" status="i" var="subCategory"> 
     <div> 
      <g:checkBox class="cb1-element" id="check${i}" name="subId.${subCategory.id}" value="on"/> 
      <label for="check${i}" > ${subCategory.name}</label> 
     </g:each> 
    </g:each> 

**創建EnquiryController.groovy行動,我要保存類別和子類別**

def create = { EnquiryCommand enquiryCommand -> 

     def enquiry = null 
     try { 
      enquiry = new Enquiry(params) 
      //def sub = Category.get(params.catId) 
       def sub = params.list('catId').get(0) 
       def subCat= params.list('subId').get(0) 

      //enquiry.properties = params 

      /* 
      def String[] tags = params.tagsList.split(",") 
      for (def tag : tags) { 
       Tag tagObject = new Tag(); 
       tagObject.tag = tag ; 
       enquiry.addToTags(tagObject) 
      } 
       */ 

      int enquiryId = enquiryService.createEnquiry(enquiry ,enquiryCommand) 
      if (!enquiry.hasErrors()){ 
       flash.put("enquiry", "enquiry created") 
       redirect(action: sentEnquiry) 
      }else { 
       render (view: "showCreateEnquiry" , model:["enquiryInstance" : enquiryCommand]) 
      } 
     }catch (DataserviceException e){ 
      render (view: "showCreateEnquiry" , model:["enquiryInstance" : enquiryCommand]) 
     } 

問題:

如何在控制器中獲取多個選定的類別和子類別並保存在數據庫中。 有人建議我在創建動作時創建一個常規的Map並從GSP模板中獲取類別和子類別的列表。還建議我使用Map的鍵來存儲來自類別和值的id,以存儲與該類別相關的子類別id的列表。

怎麼可以做到這一點?

+0

嗨@emilan,我可以在這個問題上得到幫助嗎? –

回答

2

當你與你的html屬性name工作清單必須是相同的,並且你可以通過value屬性識別您的類實例的id。翻譯這個代碼,您有:

<g:each in="" var="sub"> 
    <g:checkBox name="subcategories" value="${sub.id}" /> 
</g:each> 

而在你的控制器,你可以改變的params內容的List有:

def subcategories = params.list('subcategories') 

然後,所有你需要的是通過id查詢您的記錄。

subcategories.each { id -> 
    SubCategory sub = SubCategory.get(id) 
} 
+0

hi @sérgio-michels,我認爲對於這個解決方案,我可能需要使用Maps。對於EX:all = [ [參數:'foo',值:'aaa'], [參數:'foo',值:'bbb'], [參數:'bar',值:'ccc'] , [參數:'baz',值:'ddd'] ] def myMap = [:]。withDefault {[]} all.each {it.parameter] << it.value } 你對此有何看法?因爲使用者可以選擇多個類別並從一個類別中選擇多個子類別。所以假設我從第一個類別中選擇兩個子類別,從另一個類別中選擇一個子類別,因爲這個地圖是最好的解決方案。 –

+0

hi @ sergio-michels,使用可以選擇多個類別和子類別。如何處理這一個? –

+0

使用兩個列表,一個用於類別,另一個用於子類別。 –