如何使用Grails在数据库中保存类别和相关子类别

时间:2013-11-22 08:17:15

标签: grails map gorm

我有一个查询页面,此页面可以选择类别和子类别,同时创建新查询。对于exaple:

Main Category
 Sub Category
 Sub Category
 Sub Category

Main Category
 Sub Category
 Sub Category
 Sub Category

Main Category
 Sub Category
 Sub Category
 Sub Category

用户可以从查询页面中选择多个类别和子类别。

以下是与类别和SubCategory相关的域类:

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] )
        }

问题:

如何在控制器中获取这些多个选定的类别和子类别并保存在db中。 有人建议我在创建动作中创建一个groovy Map,并从GSP模板中获取类别和子类别列表。还建议我使用Map的键来存储类别和值的ID,以存储与这些类别相关的子类别ID列表。

怎么可以做到?

1 个答案:

答案 0 :(得分:2)

当您使用html中的列表时,name属性必须相同,并且您可以通过id属性识别班级实例的value。将其翻译为代码,您有:

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

在您的控制器中,您可以使用以下内容转换paramsList的内容:

def subcategories = params.list('subcategories')

然后,您只需按id查询记录。

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