【问题标题】:GORM: hasMany of the same domain classGORM:拥有许多相同的域类
【发布时间】:2013-04-04 07:59:42
【问题描述】:

只是想知道是否有人可以建议域类架构应该如何。我有一个名为 Category 的域类,但可以有具有相同域(Category)的子类别。例如,电器烤面包机可以在厨房类别下,小电器子类别下。

class Category {
   static hasMany = [appliances: Appliance, categories: Category] 
   String name
}

class Appliance {
   static belongsTo = Category
   static hasMany = [categories: Category]
}

【问题讨论】:

    标签: grails grails-orm


    【解决方案1】:

    需要对 Appliance 域类进行小幅调整。猜一下!! :)

    对于categories,我们不需要Appliance 中的hasMany 关系。关系是这样的:

    Category --> SubCategory (type of Category) --> Appliance
    

    设备belongsTo 是父类别以及subCategory,后者又是Category 本身。因此,belongsTo 关系在设备中就足够了。

    改用:

    class Appliance {
       static belongsTo = Category
       String name
    }
    
    class Category {
        String name
        static hasMany = [appliances: Appliance, subCategories: Category]
    }
    

    这是一个可以更好地理解事物的测试用例:

    //Category
    def kitchen = new Category(name: "Kitchen")
    kitchen.save()
    
    //Appliance
    def toaster = new Appliance(name: "Toaster")
    kitchen.addToAppliances(toaster)
    kitchen.save()
    
    //Sub Categories
    def electrical = new Category(name:  "Electrical")
    //Electrical category is a sub category of Kitchen
    kitchen.addToSubCategories(electrical)
    
    //Toaster is an appliance of Category Kitchen and Sub Category Electrical
    electrical.addToAppliances(toaster)
    kitchen.save()
    
    assert kitchen
    assert toaster
    assert electrical
    
    assert kitchen.appliances.size() == 1
    kitchen.appliances.each{assert it.name == 'Toaster'}
    
    assert kitchen.subCategories.size() == 1
    kitchen.subCategories.each {assert it.name == 'Electrical'}
    
    assert electrical.appliances.size() == 1
    electrical.appliances.each {assert it.name == 'Toaster'}
    

    如果还不清楚,请告知。

    【讨论】:

    • 感谢您的详细回答。我明白你的意思,就我而言,我希望能够跨多个类别添加产品,而不仅仅是一个。例如:类别厨房和子类别 SmallAppliance 中的烤面包机。也是电器类的烤面包机。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 2015-08-13
    相关资源
    最近更新 更多