Выбор Grails не вернет правильные данные - PullRequest
4 голосов
/ 08 августа 2011

Это продолжение этого вопроса.

У меня есть класс Address, который содержит основную информацию об адресе улицы.У меня также есть класс User, который имеет атрибуты physicalAddress, mailingAddress, cargoDestinations и cargoSources.Класс User выглядит примерно так:

class User {

    String username
    String password
    String firstName
    String lastName
    String businessName
    String phoneNumber
    Address physicalAddress
    Address mailingAddress
    static hasMany = [accounts:Account, cargoSources:Address, cargoDestinations:Address, cargoes:Cargo, loadsLogged:Load, loadsDelivered:Load]
    Set accounts, cargoSources, cargoDestinations, cargoes
    static mappedBy = [loadsLogged:"loggedBy", loadsDelivered:"deliveredBy"]

//some other stuff after this

А класс Address выглядит примерно так:

    class Address {

        static belongsTo = [user:User]

        String streetAddress
        String city
        String state
        String zip

        BigDecimal taxRate

//some other stuff after this

Я следовал учебному пособию здесь по большей части.На шаге 5 мой шаблон выглядит следующим образом:

<g:select
  from="${account.user.cargoDestinations}"
  name="cargoDestinations" value="">
</g:select>

Проблема в том, что вместо возврата только cargoDestinations шаблон возвращает ВСЕ адреса, связанные с этим пользователем.Если я изменю from="${account.user.cargoDestinations}" на from="${account.user.physicalAddress}" или from="${account.user.mailingAddress}", я получу ожидаемый результат, поэтому я знаю, что моя проблема как-то связана с отображением переменной cargoDestinations.Как я могу исправить это, не слишком меняя файлы классов?

Ответы [ 2 ]

1 голос
/ 08 августа 2011

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

class Address {
    static belongsTo = [cargoSourceFor: User, cargoDestinationFor: User]

    ...
}

class User {

    ...

    static hasMany = [cargoSources:Address, cargoDestinations:Address]
    static mappedBy = [cargoSources: "cargoSourceFor", cargoDestinations: "cargoDestinationFor"]

    ...
}

Если вы знакомы с SQL, выполнение grails schema-export и просмотр target/ddl.sql может быть полезным при настройке отображений.

0 голосов
/ 25 августа 2011

В итоге я добавил несколько логических полей в свой класс адресов, что упростило дизайн и стало намного проще работать.Таким образом, мне нужен только один класс вместо нескольких почти идентичных классов.Логические поля в классе Address теперь указывают, является ли адрес физическим адресом, почтовым адресом, источником груза и т. Д., Или всем вышеперечисленным.Как отметил @ataylor, эта система делает так, что объект адреса может быть связан только с одним пользователем из моего класса User, но, похоже, это никогда не будет проблемой.В худшем случае несколько пользователей будут иметь один и тот же адрес в реальной жизни, и моя программа потребует создания отдельного объекта адреса для каждого из этих пользователей, даже если указанные адреса будут идентичны.

...