我有一堆数据,我需要使用Grails的数据过滤器

时间:2010-06-22 19:47:23

标签: grails plugins groovy filter

我正在尝试为我的数据制作一个过滤器,以便其他人可以看到它,假设我有一堆事件,比如日历,我希望看到所有名称或标题都带有“足球” ”。 我一直试图弄清楚如何做到这一点,但没有什么对我有用,我也试图使用filterPane插件,但没有很好的工作,我更喜欢自己写一些东西,也许可以上传到Grails插件网页以备将来使用参考文献,

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:4)

如果是在域类中,请尝试:

def matches = Book.findAllByTitleLike("wonderful")

如果您不想担心大写/小写:

def matches = Book.findAllByTitleILike("wonderful")

如果您的图书标题在一个集合中:

def books = ['Wonderful Tonight', 'Atlas Shrugged', 'A Tale of Two Cities']
def matches = books.findAll{it.indexOf("wonderful") > -1} // returns []
matches = books.findAll{it.indexOf("Wonderful") > -1} // returns ['Wonderful Tonight']
matches = books.findAll{it.toLowerCase().indexOf("wonderful") > -1} // returns ['Wonderful Tonight']

<强>更新

现在我们对您的问题有了更完整的描述,让我们找出一种解决问题的简单方法。

今天,您希望按事件标题及其日期进行搜索,以便我们从那里开始,然后看看我们如何概括这一点,并在未来实现更完整的解决方案。

我们的总体流程将类似于:

  1. 您向用户显示搜索表单
  2. 用户输入日期和/或标题以搜索并提交表单
  3. 您可以找到匹配的条目
  4. 您向用户显示匹配的条目
  5. 首先,让我们为搜索表单创建一个视图,在grails-app / views / entry /中创建一个名为search.gsp的文件,其中包含以下内容:

    <g:form controller='entry' action='searchResults'>
       Entry Title: <g:textField name="title" value="${title}" />
       Entry Date: <g:datePicker name="day" value="${day}" precision="day" />
       <g:submitButton name="submit" value="Search" />
    </g:form>
    

    接下来,我们将创建控制器。在grails-app / controllers /中创建一个新的控制器EntryController.groovy。如果您还没有创建EntryController,可以通过执行'grails create-controller Entry'来执行此操作。

    现在,我们将创建两个控制器闭包:

    def search = {
      render(view:'search')
    }
    

    def searchResults = {
      def entryCriteria = Entry.createCriteria()
      def results = entryCriteria.list {
        if(params?.title) {
          ilike{"title","%${params.title}%"
        }
        if(params?.day) {
          eq("eventDate", params.day)
        }
      }
      render(view:'searchResults', model:['results':results])
    }
    

    最后,让我们在grails-app / views / entry中创建一个searchResults.gsp

    <h1>Results</h1>
    <g:each in=${results}>
      ${it}
    </g:each>
    

    所以,现在把它们放在一起:

    1. 运行您的应用并转到localhost:8080 / $ {appName} / entry / search,这应该会显示您的搜索表单。
    2. 输入标题和/或日期,提交表单,并将表单数据发送到控制器的searchResults闭包中
    3. 关闭中的条件搜索将找到符合搜索条件的所有条目
    4. 您渲染搜索结果视图并将匹配的条目传递给它,然后在gsp上循环显示每个结果并显示它。
    5. 作为免责声明,我正在堆栈溢出文本编辑器中动态编写此代码,因此如果我错过了一些语法问题,我不会感到惊讶。希望这个解释足以让你顺利上路。现在让我们谈谈采用这个基本的例子并将其提升到一个更可敬的解决方案。

      我建议您在掌握这个基本示例之后尝试执行以下操作:

      1. 尝试构建一个命令对象来表示您的搜索表单,它将允许您验证用户的输入,并且比直接处理请求参数(如上所述)更易于管理。
      2. 为命令对象和控制器流构建一些单元测试;检查是否正在为各种验证填充错误消息。
      3. 进行我们在searchResults闭包中定义的条件搜索,并将其移至单独的Grails服务,将命令搜索对象传递给服务以获取结果。然后,如果您需要,可以在以后的应用程序中重新使用搜索功能。
      4. 为您的服务构建一些单元测试;模拟输入域对象并验证您的搜索功能是否正常工作。
      5. 如果您正努力让上述解决方案发挥作用,请尝试进一步简化它。消除日期搜索,只按标题搜索。将searchResults操作中的所有条件逻辑替换为:

        def results = Entry.findByTitleILike(params?.title)
        

        开始简单并改进,你马上就能掌握它。

        祝你好运!

答案 1 :(得分:1)

您可以通过示例查询或使用findAllWhere,如果您只需要按相等性过滤。否则,您将需要使用条件构建器来生成相应的查询。

答案 2 :(得分:1)

filter插件似乎符合您的要求。

相关问题