Tyler Evans
Tyler Evans

Reputation: 579

Grails search/filter multiple parameters - controller logic

Using Grails (or hibernate), I was wanting to know if there is a specific design pattern or method we should be using when implementing a SEARCH of our domain.

For example, on my website, I want to be able to filter(or search) by multiple properties in the domain.

EG: For I have a page which displays a list of HOTELS. When I submit a search form, or if a user clicks "filter by name='blah'", when I enter the controller I get the following:

Domain
  String name
  String location

Controller
  if(params.name && params.reference) {
      // Find name/reference
  } else if(params.name) {
      // Find name
  } else if(params.reference) {
      // Find reference
  } else {
      // Find all
  }

As you can understand, if there are more properties in the domain to search/filter, the longer the controller gets.

Any help. Please note, I do not want to use the 'searchable' plugin, as this is too complex for my needs.

Upvotes: 2

Views: 1044

Answers (1)

Joshua Moore
Joshua Moore

Reputation: 24776

I would embed these in a named query in the Domain class itself. For example:

Class Hotel {
  String name
  String city
  String country
  boolean isNice

  static namedQueries = {
    customSearch { p ->
      if (p?.name) eq('name', p.name)
      if (p?.city) eq('name', p.city)
      if (p?.country) eq('name', p.country)
      if (p?.isNice != null) eq('isNice', p.isNice)
    }
  }
}

Then later in a controller somewhere ...

def results = Hotel.customSearch(params)

Of course this is a very simple example, but you can expand on it using the same named query or even adding others and chaining them together.

Upvotes: 3

Related Questions