2010-09-27 90 views
1

使用Grails的檢索插件,我已經得到了這些類:Grails可搜索:搜索成員對象中的特定字段?

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

和:

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

我想做來自特定國家的人特定的搜索。 「國家:NL」不起作用。 「地址:國家:NL」也不起作用。我無法找到任何有關此語法的信息。有任何想法嗎?

我想我必須在可搜索的閉包中做一些聰明的索引或其他一些技巧,但我無法找到它。

回答

3

我創建了一個基本的應用程序(Grails的1.3.5,檢索0.5.5.1)與你的兩個類和搜索:我的作品「國家NL」。您是否記得在嘗試搜索之前調用index()?

grails create-app search 
grains install-plugin searchable 

人:

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

    Address address 
} 

地址:

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

引導:

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 = { 
    } 
} 

然後我瀏覽到到/搜索和搜索國家:NL,得到了人1個返回。

如果你想看到什麼檢索在幕後做至於田/索引,等等 - 盧克是一個非常方便的工具(只需下載可執行的JAR文件):http://code.google.com/p/luke/

索引文件是

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

歡呼

+0

你舉的例子聽起來完全像我沒有料到它的工作,但對我來說沒有。 (簡單的搜索可以工作,所以這不是問題。)我會給盧克一個嘗試,看看它是否被索引。我想很高興知道這實際上應該像我預期的那樣工作。現在弄清楚爲什麼它不適合我的項目。 – mcv 2010-10-12 12:57:04

0

工作的醜陋解決方案:不依賴於可搜索。目前我首先執行Person.search(params.query, [max:99999]).results,然後執行簡單的.findAll以查找國家和.sublist()以使分頁再次工作。

很遺憾,很難找到如此明顯的與Searchable配合使用的東西。

另一個解決方案,我沒有得到工作是使國家對Person返回address.country的瞬態屬性。沒有開箱即用,我不知道如何解決這個問題。

如果有人對我有更漂亮的解決方案,我很樂意聽到他們。

0

我是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() 
      } 
     }