Grails для поиска: поиск определенного поля в объекте-члене? - PullRequest
1 голос
/ 27 сентября 2010

Используя плагин Grails Searchable, у меня есть следующие классы:

class Person {
 static searchable = {
  address component: true
    }
}

и:

class Address {
 static searchable = {
  root false
 }
 String country
}

Я хочу выполнить определенный поиск людей из определенной страны."страна: NL" не работает."address: country: NL" тоже не работает.Я не могу найти ничего о синтаксисе для этого.Любые идеи?

Я думаю, что мне придется сделать некоторую хитрую индексацию или какой-то другой трюк в поисковом закрытии, но я просто не могу его найти.

Ответы [ 3 ]

3 голосов
/ 11 октября 2010

Я создал базовое приложение (Grails 1.3.5, Searchable 0.5.5.1) с двумя вашими классами, и поиск 'country: NL' работает для меня.Помните, вы вызывали index () перед попыткой поиска?

grails create-app search
grains install-plugin searchable

Person:

class Person {
  static searchable = {
    address component: true
  }

  Address address
}

Адрес:

class Address {
  static belongsTo = Person
  static searchable = {
    root false
  }
  String country
}

Bootstrap:

class BootStrap {

    def init = { servletContext ->

      def p1 = new Person(address:new Address(country:'NL')).save()
      def p2 = new Person(address:new Address(country:'DE')).save()
      def p3 = new Person(address:new Address(country:'NZ')).save()

      Person.index()

    }

    def destroy = {
    }
}

Затем я перешел к / searchable и искал страну: NL и вернул человека 1.

Если вы хотите посмотреть, что делает Searchable под прикрытием в отношении полей / индексов и т. Д. -Люк - очень удобный инструмент (просто скачайте исполняемый файл JAR): http://code.google.com/p/luke/

Индексные файлы находятся в

<user.home>/.grails/projects/<project name>/searchable-index/development/index

ура

Ли

0 голосов
/ 06 октября 2010

Я новичок в Grails, но зачем вам использовать поисковый плагин?

что не так с простыми отношениями 1: 1 или 1: n?

    package com.test
class Person {

        static constraints = {
          name (nullable:false)
          address (nullable:true)
        }

        String name
        Address address

        String toString() {
          "name[" + name + "]. address[" + address + "]"
        }

        static mapping = {
          address lazy:false
        }
    }


    class Address {

        static constraints = {
          country (nullable:false)
          town   (nullable:false)
        }
        String country
        String town
        //Person person

        static  belongsTo = [person:Person]
    //    static  belongsTo = Person

        String toString(){
          "town[" + town + "], country[" + country + "]"
        }
    }

        package com.test

        import grails.test.*

        class PersonIntegrationTestTests extends GrailsUnitTestCase {
            protected void setUp() {
                super.setUp()
            }

            protected void tearDown() {
                super.tearDown()
            }

            void testSomething() {
              def bill = new Person(name:'bill', address:new Address(town:'york', country:'UK')).save()
              def fred = new Person(name:'fred', address:new Address(town:'leeds', country:'UK')).save()
              def bjork = new Person(name:'helen', address:new Address(town:'helsinki', country:'finland')).save()
              def gustav = new Person(name:'john', address:new Address(town:'helsinki', country:'finland')).save()

              List ukAddresses = Address.findAllByCountry('UK') // find all by country

              println "num addresses-" + ukAddresses.size()

              for (int i in 0..<ukAddresses.size())
              {
                println "found person:" + ukAddresses[i].person
              }

              assertNotNull "bill can not ne null", bill
              assertTrue bill.validate() && !bill.hasErrors()
              assertTrue fred.validate() && !fred.hasErrors()
              assertTrue bjork.validate() && !bjork.hasErrors()
              assertTrue gustav.validate() && !gustav.hasErrors()

              assertEquals 2, ukAddresses.size()
            }
        }
0 голосов
/ 28 сентября 2010

Уродливое решение, которое работает: не полагайтесь на Searchable. В данный момент я сначала делаю Person.search(params.query, [max:99999]).results, затем делаю простой .findAll, чтобы найти по стране, и .sublist (), чтобы пейджинг снова заработал.

Обидно, что так сложно заставить что-то столь очевидное работать с Searchable.

Другое решение, которое я не нашел, - это сделать страну переходным свойством для Person, которое возвращает address.country. Не работает из коробки, и я понятия не имею, как это исправить.

Если у кого-нибудь есть более красивые решения для меня, я бы хотел их услышать.

...