【问题标题】:reuse Criteria in Grails ControllerGrails 控制器中的重用条件
【发布时间】:2011-02-23 15:18:35
【问题描述】:

通常,您在 Grails 生成的控制器列表方法中有以下最后一行:

[userInstanceList: User.list(params), userInstanceTotal: User.count()]

如果我想通过特定条件限制用户,它看起来像

[userInstanceList: User.list(params) {
   ilike('login', '%test%')
 }, userInstanceTotal: User.count() {
   ilike('login', '%test%')
 }]

但这违反了 DRY 原则 - 重用标准闭包的最佳方法是什么?

【问题讨论】:

    标签: grails closures criteria


    【解决方案1】:

    来自标准构建器的分页结果(结果类是PagedResultList)有一个属性totalCount,您可以像在相同标准上调用count() 一样使用它:

    def userInstanceList = User.createCriteria().list(params) {
        ilike 'login', '%test%'
    }
    [userInstanceList: userInstanceList, userInstanceTotal: userInstanceList.totalCount]
    

    【讨论】:

    • 这应该是公认的答案。使用PagedResultList 真的是一个很棒的提示!
    【解决方案2】:

    针对这种情况的另一种方法(需要在各种不同的条件查询中重用相同的逻辑)可能是使用 groovy 闭包,正如您在帖子标题中所述。

    正如 Dana 在她的回答中发布的那样,使用 PagedResultList 的 totalCount 属性可以更好地解决您的特殊情况。但是您可能会遇到更复杂的情况,您必须在标准中重用逻辑。对于类似的情况,我已经成功尝试了以下解决方案。以您的案例为例:

    def iLikeLoginClosure = { builder ->
        builder.ilike('login', '%test%')
    }
    [
        userInstanceList: User.list(params) {
            iLikeLoginClosure delegate
        },
        userInstanceTotal: User.count() {
            iLikeLoginClosure delegate
        }
    ]
    

    iLikeLoginClosure 中的builder 是对调用闭包的标准构建器对象的引用。此外,在 iLikeLoginClosure 内部,您可以在定义的闭包内使用相同范围的变量。

    这是受到这篇文章的启发:http://mrhaki.blogspot.com.ar/2010/06/grails-goodness-refactoring-criteria.html 来自 MrHaki 的优秀博客。

    【讨论】:

      【解决方案3】:

      您可以使用named queries

      在您的域类中:

      static namedQueries = {
          ilikeLogin{login->ilike('login', "%$login%")}
      }
      

      在您的控制器中:

      def userList = User.ilikeLogin('test').list(params)
      def usersCount= User.ilikeLogin('test').count()
      

      或者(我不能 100% 确定这会奏效,但请尝试一下。):

      def query = User.ilikeLogin('test')
      def userList = query.list(params)
      def usersCount= query.count()
      

      【讨论】:

        猜你喜欢
        • 2015-02-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-30
        相关资源
        最近更新 更多