Grails绑定一对一关联

时间:2015-11-10 09:32:58

标签: grails data-binding gorm grails-2.0 grails-controller

当您生成grails视图时,grails会查看您的关系并为您的表单数据生成正确的html,以便自动绑定到后端域。对于一对一关联grails创建一个下拉列表。

但是,您可能不希望将该属性显示为下拉列表,而是更自定义的内容(例如,具有自动完成功能的文本字段)。一旦你这样做,从该字段到控制器的值,作为一个字符串,你必须首先:

  1. 清除错误
  2. 根据给定的参数执行findBy并将其分配给域的属性
  3. 我真的想避免尽可能多地在控制器中执行findBys,因为看起来我正在做的逻辑/事情不应该去那里。控制器应委托给服务层。我不清楚grails文档中如何通过使用 bindData 来做到这一点,它似乎与String,date,Integer属性等一起工作得很好..但是我没看到如何使用bindData对于其他域的属性。

    我也真的想避免将 params 对象传递给Service层,因为它似乎不太可重用(或者可能不是,如果我错了,请纠正我)。我想我不喜欢它在语义上看起来如何。我希望第一个超过第二个:

    @Transactional
    class WithdrawService {
    
        def addWithdraw(Withdraw withdraw) {
    
            //perform business logic here
        }
    
        def createWithdraw(Map params){
    
            //perform business logic here
        }
    }
    

    我们采取以下示例:

    class Withdraw {
    
       Person person
       Date withdrawDate
    
    }
    

    和父查找表

    class Person {
    
       String name
       String lastName
    
       static constraints = {
       }
    
    
       @Override
       public String toString() {
         return "$name $lastName"
       }
    

    }

    为了在没有任何额外工作的情况下自动发生绑定,grails会在以下请求参数中传递以自动绑定一对一:

    1. person.id
    2. 带有身份证的人物地图。

      [person.id:2,person:[id:2],withdrawDate:date.struct,withdrawDate_month:11,create:Create,withdrawDate_year:2015,withdrawDate_day:10,action:save,format:null,controller:撤回]

    3. 最好的方法是什么?

      1. 传递两个看起来完全相同的隐藏字段: person.id:2,person:[id:2] 由于填充自动填充的Ajax调用而填充?
      2. 在控制器中执行Person.findBySomeKnownProperty(params.someKnownValue)
      3. 或任何其他方法?

0 个答案:

没有答案