2017-04-04 60 views
0

我可以知道如何在Ruby和Ruby on Rails中创建一对多的关系到Google Cloud Datastore中?如何在Ruby中的Google云数据存储中创建一对多关系

现在我正在写这样的代码。

class Author 
    attr_accessor :name, :books 
end 

class Book 
    attr_accessor :title, :description, :author_id 
end 

> @author.books 
[2, 3, 5] 
> Book.find(@author.books.first) 
<Book: .... 

我正在将一些Book ID插入作者的书中。 但我觉得有更复杂的方法。

我想使用'belongs_to'和'has_many'在Google Cloud Datastore中实现代码。可能吗?

回答

0

你可以声明书作为一个作家的孩子:

book_key = datastore.key [["Author", "Someone"], ["Book", "sampleBook"]] 

多见于Entities, Properties, and Keys >> Ancestor Paths文档。

在使用此结构之前仔细思考。如果一本书有多个作者,则需要为每位作者多次复制书籍。在数据存储中,每个孩子只能有一个父母。数据存储中没有官方多对多关系,尽管您可以在代码和数据结构中模拟模拟,类似于您已经在做的事情(使用Book实体中的自定义authorid属性)。

0

我同意雷纳托。你基本上有一个多对多的场景。作者可以写几本书,相反,书可以有多个作者。

不幸的是,Google Datastore中没有多对多关系的显式机制。但是你仍然可以构建你的实体来建模关系。

例如,而不是使用通过祖先路径的层次模型,添加一个数组来存储引用作者的实体按键,可能是这个样子你的书的实体:

book_key = datastore.key "Book" 

author_key1 = datastore.key "Author", "john" 
author_key2 = datastore.key "Author", "jane" 

author_entity1 = datastore.entity author_key1 do |t| 
    t["name"] = "Doe, John" 
end 

author_entity2 = datastore.entity author_key2 do |t| 
    t["name"] = "Doe, Jane" 
end 

datastore.save(author_entity1, author_entity2) 

而且在数组属性Book实体会是这个样子:

book_entity = datastore.entity book_key do |t| 
    t["authors"] = [author_key1, author_key2] 
end 

如果你想知道与笔者李四在你的数据库相关联的所有你需要做的就是查询“作者”数组属性的所有书籍:

query = Google::Cloud::Datastore::Query.new 
query.kind("Book"). 
    where("authors", "=", datastore.key("Author","john")) 

books_by_john = datastore.run query 

请注意,我本可以走另一条路,并在作者实体上创建一个Book键数组。但是,如果我走了这条路线,并试图模仿一个多产的作家,比如说说斯蒂芬·金......那么作者实体最终会因为对图书实体的关键引用而变得非常臃肿,所以你必须对关系的哪一方进行选择你添加数组并尝试寻找不太可能膨胀的实体。

相关问题