2015-01-14 4 views
1

Предположим, что у меня есть два домена:Grails: Как назначить поле домен = SomeValue выборка из базы данных

class Country { 

    String name 
    String Desc 

    static hasMany = [organizations: Organization] 
} 

class Organization { 
    String name 
    Country country 

    static belongsTo = [country:Country] 
} 

Примечание: В случае создания организации, страны будут перечислены в выпадающем списке.

Предположим, у меня есть 4 ряда в моей базе данных, которые я выбрал из бутстрапа.

**Name** **Desc** 
US  USA 
CA  CAN 
NP  NEP 
IN  IND 

Я хочу присвоить США значение по умолчанию при создании Организации. Есть ли способ сделать это с уровня домена, а не gsp?

ответ

0

Я думаю, что ваш лучший выбор - это ваш лучший выбор, хотя для этого вам требуется идентификатор экземпляра, который вы хотите по умолчанию. Неплохо продумать это, потому что это может измениться в будущем. Но вы можете посмотреть его, когда приложение запустится и сохранит идентификатор, например.

class BootStrap { 

    def grailsApplication 

    def init = { 
     def usa = Country.findByName('US') 
     grailsApplication.config.COUNTRY_US_ID = usa.id 
    } 
} 

Используйте любую конфигурационную клавишу, которую вы хотите, конечно.

Затем измените Organization класс для вызова load в своем конструкторе:

import grails.util.Holders 

class Organization { 

    Organization() { 
     if (Holders.config.COUNTRY_US_ID) { 
     country = Country.load(Holders.config.COUNTRY_US_ID) 
     } 
    } 

    String name 

    static belongsTo = [country:Country] 
} 

Обратите внимание, что я удалил Country country свойство, потому что это излишним; добавив, что belongsTo создает свойство с тем же именем, что и ключ карты («страна»), и тот же тип, что и значение карты (Страна). Это не больно, но это не нужно.

Причина, по которой load уместна, заключается в том, что она не попадает в базу данных, пока вы не получите доступ к постоянному свойству, отличному от id. Таким образом, вы настраиваете его для ленивого извлечения реального экземпляра, если это необходимо, но если вы перезапишите это значение другим экземпляром, вы не потратите понапрасну на поиск базы данных для начальной совокупности. Включите ведение журнала SQL, чтобы проверить это.

Смежные вопросы