域类翻译的ORM Scheme / Plugin

时间:2011-06-19 19:22:33

标签: grails translation

我的问题只是放在Grails中:我想要一个插件或示例来进行Domain Classes的翻译。

描述:我希望在它背后有一个很好的数据库方案。例如

域名类别1 :图书(id,author_id,number_pages)

图书的翻译 :( book_id,语言,标题,说明)

域名类别2 :作者(身份证明,生日)

作者的翻译(author_id,language,first_name,last_name)(例如,同一作者在不同国家/地区的不同名称下已知)

我想做什么:了解语言,我想获得带有ID的书,以及EAGER获取其作者(当然书和作者使用正确的翻译)。或者例如,由作者搜索所有书籍,由国家/语言中的first_name知道。

你会如何使用GORM手动完成?

是否有一个插件可以隐藏“业务逻辑”?

或者我怎样才能简单地获得一本书的所有翻译?

2 个答案:

答案 0 :(得分:0)

Whab只是按原样使用GORM - 即Book和BookTranslations是两个域对象,Book和BookTranslations之间有一对多的翻译,然后你可以做BookTranslations.findAllByBook,条件查询等。

我建议这样做的原因是你的描述中有一个实体关系(即一对多),所以它不像父/子/嵌入式样式类层次结构会为你做任何事情。这也使您可以完全控制提取策略[1]

我认为这里唯一的'秘诀就是你可以标准化你代表语言的方式。例如,如果您在这些行中实际上有一些unicode文本或映射到标准消息文件,那么您可以使用BookTranslation表中语言列的ISO标准语言名称(例如en-US表示美国英语)。这将允许您直接利用Grails internationalizatino功能,可以自动解析语言环境和消息文件,还有taglib和其他好东西,使国际化不那么痛苦。

见[2]

一个简单的例子如下所示(未经过测试,因此请原谅任何编译错误):

class Book {
    String author
    int numPages
    static hasMany [ bookTranslations: BookTranslations]
}

class BookTranslations { 
    String language
    String title
    String description
    static belongsTo = Book
}

def book = new Book(author:"test", numPages:20)
book.save()
def translation1 = new BookTranslations(language:"en-us", title:"How to Book", description:"A wonderful book")
book.addToBookTranslations(translation1)
def translation2 = new BookTranslations(language:"en-us", title:"Second How to Book", description:"A glorious book")
book.addToBookTranslations(translation2)

def results = BookTranslations.findAllByBook(book)
// or ..
results = book.bookTranslations

幸运的是,Grails文档中GORM章节中的示例都是关于作者和书籍的。见[3]

[1] http://grails.org/doc/latest/guide/5.%20Object%20Relational%20Mapping%20%28GORM%29.html#5.5.2.8%20Eager%20and%20Lazy%20Fetching

[2] http://grails.org/doc/latest/guide/10.%20Internationalization.html

[3] http://grails.org/doc/latest/guide/5.%20Object%20Relational%20Mapping%20%28GORM%29.html

答案 1 :(得分:0)

偶然发现plugin,似乎可能就是你要找的东西。