2011-08-08 18 views
4

這是一個延續this的問題。Grails select將不會返回正確的數據

我有一個Address類,它包含基本的街道地址信息。我也有一個User類,它具有physicalAddress,mailingAddresscargoDestinationscargoSources的屬性。該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 

我跟着教程here大部分。在第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變量的映射方式有關。我怎樣才能解決這個問題,而不用更改我的課程文件太多?

+0

有幾個問題:1)「用戶」和「地址」關係是雙向的嗎? 2)如果是這樣,你的用戶域中是否有['mappedBy'](http://www.grails.org/doc/latest/ref/Domain%20Classes/mappedBy.html)? ......不確定是否會導致這種情況,但這是需要考慮的事情。 –

+0

@Rob我更新了我的問題,提供了關於我的課程的更多詳細信息。 – ubiquibacon

回答

0

我最終在我的地址類中添加了幾個布爾字段,這使得設計更簡單並且更容易處理。這樣我只需要一個類而不是幾個幾乎相同的類。 Address類中的布爾字段現在指示地址是物理地址,郵寄地址,貨源等,還是以上全部。正如@ataylor指出的那樣,這個系統使得地址對象只能與我的類User中的一個用戶關聯,但似乎並不是一個問題。最糟糕的情況是多個用戶在現實生活中會有相同的地址,而且我的程序需要爲每個用戶創建一個單獨的地址對象,即使這些地址是相同的。

1

您的地址映射方式,它們都鏈接回user_id列的用戶。您需要向Address添加一些字段以區分它們與User相關的方式,類似於您如何映射Loads。例如:

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

謝謝,我會試一試,我沒有意識到一個對象可能屬於多於一個其他對象。我沒有使用RazorSQL連接到Grails數據庫文件,只是爲了看看這些表是如何設置的,但我也會嘗試'schema-export'。 – ubiquibacon

+0

讓我問你這個問題,我如何解決這個事實,即我的用戶還有一個(並且只有一個)'physicalAddress'和一個(且只有一個)'mailingAddress'?那些需要以同樣的方式進行映射嗎? – ubiquibacon

+0

不,差異在於數據庫如何表示關係。當你有一個用戶到很多地址時,如'cargoDestinations'和'cargoSources'中,用戶ID存儲在地址表中。當你(可能)有多個用戶地址時,就像在'physicalAddress'或'mailingAddress'中那樣,地址標識存儲在用戶表中。 – ataylor