【问题标题】:How to create one to many relationship into Google Cloud Datastore in Ruby如何在 Ruby 中创建与 Google Cloud Datastore 的一对多关系
【发布时间】:2017-04-04 16:11:17
【问题描述】:

我可以知道如何在 Ruby 和 Ruby on Rails 中创建与 Google Cloud Datastore 的一对多关系吗?

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

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: ....

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

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

【问题讨论】:

    标签: ruby-on-rails ruby google-cloud-datastore


    【解决方案1】:

    您可以将图书声明为作者的孩子:

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

    Entities, Properties, and Keys >> Ancestor Paths 文档中查看更多信息。

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

    【讨论】:

      【解决方案2】:

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

      很遗憾,Google Datastore 中没有明确的多对多关系机制。但是您仍然可以构建实体来对关系建模。

      例如,不是通过祖先路径使用分层模型,而是向您的 Book 实体添加一个数组,该数组存储引用 Author 实体的键,这些键可能如下所示:

      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
      

      如果您想知道数据库中与作者 John Doe 相关的所有书籍,您只需查询“authors”数组属性:

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

      请注意,我也可以另辟蹊径,在 Author 实体上创建 Book 键数组。但是我是否走那条路并尝试为多产的作者建模,比如斯蒂芬金......那么作者实体最终会因对书籍实体的关键引用而变得非常臃肿,所以你必须选择关系的哪一方您添加数组并尝试寻找不太可能膨胀的实体。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-10
        • 1970-01-01
        • 1970-01-01
        • 2020-01-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多