2015-03-25 2 views
0

У меня типичная проблема с использованием флажков. У меня есть сотрудники и навыки. Каждый сотрудник может обладать многими навыками, а навыки могут принадлежать многим сотрудникам. Это делает его много-много отношений.Использование флажков во многих отношениях в графе

This мои классы Доменные

class Skill { 
    String name 
    static hasMany = [users:Employee, resources:Resource] 
    static belongsTo = [Employee] 

    static constraints = { 
     name unique: true, nullable: false, blank: false 
    } 

    String toString() { return name } 
    String getDisplayName() { return name } 
} 

class Employee { 

String name 
String surname 
Date birthdate 
BigDecimal salary 
Address address 

static hasMany = [skills: Skill] 
static belongsTo = [team:Team] 

static constraints = { 
    address nullable: false, blank: false 
    name nullable: false, blank: false, matches: '[a-zA-Z\\-\'\\s]+' 
    surname nullable: false, blank: false, matches: '[a-zA-Z\\-\'\\s]+' 
    skills nullable: true, blank: true 
    salary nullable: false, min: 16000.0, max: 60000.0 
    team nullable: true 
    birthdate max:new Date(use(TimeCategory){18.years.ago.getTime()}) 
} 

String toString() { return "\nEmployee Information:\n Name: $name\n Surname: $surname\n " + 
     "Date of Birth: $birthdate\n Salary: $salary\n"} 

}

домен Служащий работает отлично, я могу создать сотрудника с адресом без каких-либо проблем.

Но когда я пытаюсь добавить навыки к сотруднику, он не делает то, что я тоже рассказываю. Например, когда я проверяю два конкретных навыка, он пытается запустить и сохранить, он добавит все навыки работнику.

Как я могу сказать контроллеру только добавить то, что было проверено.

Это мой код в контроллере

@Transactional 
def create() { 
    params.each { println("$it.key -> $it.value") } 
    def employee = new Employee(params) 
    def address = new Address(params) 
    def skills = Skill.list() 

    if (params["create"]) { 
     if (address.validate()) { 
      address.save() 
      employee.address = address 
      params.remove("_s") 
      skills.each { skill -> if (params["s"] != null) { 
       employee.addToSkills(skill) 
       } 
      } 
      if (employee.validate()) { 
       employee.save() 
       flash.message = "Employee has been successfully created" 
       redirect(action: "index") 
      } 
     } else { 
      flash.message = "Ooops Error!!!!" 
      render(view: "create", model: [employee: employee, address: address, skill: skills]) 
     } 
    } 
    [employee: employee, address: address, skill: skills] 
} 

Это мой create.gsp

<div class="col-md-6"> 
<label>Select Your Competences:</label> 
    <g:each in="${skill}" var="s" status="i"> 
    <br/> 
    <g:checkBox name="s" value="${s.id}" checked="false"/> 
    <label for="s">${s.name}</label> 
</g:each> 
</div> 
+0

При использовании 'г: проверка Box "проверенное значение отправляется с использованием имени с префиксом подчеркивания. В вашем случае '' 'всегда будет содержать все значения независимо от их проверки. Только параметр '_s' будет содержать проверенные значения. –

ответ

0

модифицировать GSP как:

<label>Select Your Competences:</label> 
    <g:each in="${Skill.list()}" var="skill" status="i"> 
    <br/> 
    <g:checkBox name="s.${skill}" value="${skill.id}" checked="false"/> 
    <label for="s">${skill}</label> 
</g:each> 
</div> 

когда вы submitt эту форму, вы сможете получите параметры на вашем контроллере, имеющие такие значения: [skill:[_MsOffice:'', MsOffice:1, Managing:10, AgileCoach:3, _Coding:'']

, чтобы получить идентификаторы проверяемых значений из Params выполните следующие действия на контроллере:

List<Long> skillIds = new ArrayList<Long>() 

    params.skill?.each { s -> 

    if(!s.getKey().startsWith("_")) { 

    skillIds.add(s.getValue()) 
    } 
    } 

теперь skillIds списке у вас есть список Skill идентификаторов для Employee, затем передать это к вашим услугам и получать навыки, чтобы добавить к Employee (с использованием Skill.getAll(skillIds) или какой-либо другой операции Горм)

вы можете увидеть пример здесь http://groovyconsole.appspot.com/script/5722903798611968

+0

Это сработало, но я немного поменял его на контроллере. 'для (Специалисту в params.s) { employee.addToSkills (Skill.get (умение)) }' я немного меньше кода и легче читать. params.s исходит из отмеченных флажков, были ли _s неконтролируемыми –

Смежные вопросы