2015-02-24 60 views
1

簡而言之,它是一個庫存系統,與SKU綁定。 SKU是一個項目的組合,有時是完全相同項目的多個項目。Grails GORM領域類具有許多相同類型和重複條目

E.G

SKU爲一套餐廳將是,4(項目) 「椅子」 和1(項目) 「表」。如果我能讓GORN認識到它與「椅子」的多個實例相關聯,那麼我可以繼續計數。

這裏是基本的代碼,我已經試過

class Item implements Serializable{ 
    String name; 
    String description; 

} 

class Sku { 
    String description; 
    String skuCode; 
    Collection items; 
    static hasMany = [items:Item]; 
} 
//… GENERATE TEST DATA 
    item = new Item(name:"Table", description:"Oak table"); 
    item.save(); 

    item = new Item(name:"Chair", description:"Oak chair"); 
    item.save(); 

    sku= new Sku(description:"A complete dining room set for 4"); 
    sku.items = [Item.findByName("Table"),Item.findByName("Chair"), 
        Item.findByName("Chair"),Item.findByName("Chair"), 
        Item.findByName("Chair")]; 
    sku.save(); 

這將只顯示SKU爲「表」和「椅子」的。

我甚至不確定如何在SQL中執行此操作。但我想知道是否有一個能夠實現我想要的結構。這似乎是一種乾淨的編碼方式。

最終目標是SKU將包含許多不同項目組合的系統,我希望能夠通過輸入項目組合來縮小可能的SKU範圍。

例如,如果我搜索表+ 1米的椅子,我就見表& 4Chairs和表+ 2把椅子(它插入後)等或表+椅子+島+凳(S)+冰箱

謝謝

+1

我認爲你是在良好的軌道。即使我不太喜歡你的模式,我認爲應該可以在它的實際狀態下使用它來實現你需要的查詢。你能更詳細地描述你的問題嗎? ...你是什麼意思「這隻會顯示SKU是」表格「和」主席「。」 – Rafael 2015-02-24 13:53:09

+0

模式有什麼問題?請記住,這不是我真正建立的,這是我能夠解釋我的計劃的最簡單方法。但我是GORM的新手,所以我可能會錯過一些非常明顯的東西。 – kevingreen 2015-02-24 13:53:43

+0

如果我要以更嚴格的Java實體方式來做到這一點,我可以使用Map 的地圖,因此它將是<"Chair",4>。但是,這使我鎖定每一件物品的追蹤計數(可能不是一件壞事?) – kevingreen 2015-02-24 13:57:47

回答

1

這花了一點時間去了解文檔。

Zoidberg是正確的,GORM默認爲一組。我曾使用過Collection,因爲我的理解是,這是一個可能包含重複項的無序列表。 The documentation讓我嘗試一個列表。列表允許重複。它確實提到了使用列表的性能,所以請閱讀該部分。這是我首先使用Collection的原因,但這似乎並不能滿足我的需要。

另一個問題是如何基於部分列表進行查詢。 E.G退回所有具有「主席」項目的SKU。

This SO answer ended up being my solution to that piece.

因此,這裏是我的示例代碼,因爲它主張。

class Item implements Serializable{ 
    String name; 
    String description; 

} 

class Sku { 
    String description; 
    String skuCode; 
    List items; 
    static hasMany = [items:Item]; 
    } 

//… GENERATE TEST DATA 
item = new Item(name:"Table", description:"Oak table"); 
item.save(); 

item = new Item(name:"Chair", description:"Oak chair"); 
item.save(); 

sku= new Sku(description:"A complete dining room set for 4"); 
sku.items = [Item.findByName("Table"),Item.findByName("Chair"), 
       Item.findByName("Chair"),Item.findByName("Chair"), 
       Item.findByName("Chair")]; 
sku.save(); 

//Query test data 
Sku.executeQuery("FROM Sku as s WHERE :item in elements(s.items)", 
    [item: Item.findByName("Chair")]) 
//returns List<Sku> of any Sku's that contain the item "chair". 
//I need to create a version that takes a list, so I can narrow the search. 

This issue in Jira與GORM是非常相似的一個我得到的,如果我嘗試使用findByItemsInList,或任何其他findBy *。

0

您正在添加相同的Item 4 Times(椅子)。

sku.items = [Item.findByName("Table"),Item.findByName("Chair"), 
        Item.findByName("Chair"),Item.findByName("Chair"), 
        Item.findByName("Chair")]; 

但默認情況下,GORM會創建一個Set。參見: http://grails.github.io/grails-doc/latest/ref/Domain%20Classes/hasMany.html

並且集不能包含重複項。如果你想繼續計數,你可以添加一個Integer來計算你的Item,並在你使用它時增加/減少它。

或者根據需要創建名稱爲「椅子」的儘可能多的項目。

+1

我搞清楚使用List可能是我的解決方案。我需要再努力一點。列表將允許重複,並按照添加順序存儲它們。使用腳手架,我可以快速查看物品並正確存放。 查詢會更棘手,但我認爲我也解決了這個問題: 'Sku.executeQuery(「從Sku as s WHERE:item in elements(s.items)」,[item:Item.findByName(「Chair」)) ])'將返回包含1個或更多椅子的任何SKU。 – kevingreen 2015-02-24 14:47:04

+0

我最初使用Collection來解決Set問題,但是更新的文檔告訴我這不是正確的方法 – kevingreen 2015-02-24 14:49:51