2

我想知道什么是多态关联(在数据建模意义上),因为我知道它们很常见,我想学习如何在 Rails 中实现它们。

该术语是否描述了以下情况,例如,

  • web_post_country
    • web_post具有(作为其主题) > 0 或 1 个国家/地区
    • 一个国家0 个或多个 web_posts描述
  • web_post_country
    • web_post有(作为其主题) 0 或 1 个区域
    • 一个区域0 个或多个 web_posts描述
  • region_country
    • 一个地区1 个国家
    • 一个国家0 个或多个地区

? (这些实施起来总是有点棘手)。

一旦我知道它们是什么,我就准备在这里研究第二个问题的问答:如何在 Rails中实现它们。

希望这不会超出本论坛的范围......我的最终目标是学习多态关联的 Rails 实现。

4

2 回答 2

1

通过主键/外键创建常规关联。

User "Bob", id: 1
Book "The Sponge", id: 1, user_id: 1

外键user_id是指用户的主键。


多态关联与主键/外键以及对象的“类型”一起使用:

User "Bob", id: 1
Book "The Sponge", id: 1, owner_id: 1, owner_type: "User"

在这里,我们需要两个字段来检索书的所有者:

我们知道所有者的 id 是 1,所有者的类型(类)是“用户”,所以让我们找到 id = 1 的用户!


这意味着您可以拥有多种类型的所有者:poly(几种)-morphic(类型,类)

例如,您可以拥有由 Client 对象拥有的 Book:

Client "XXX", id: 12
Book "Catalog", id: 2, owner_id: 12, owner_type: "Client" # => owner is client #12
Book "Anoying", id: 3, owner_id: 20, owner_type: "User" # => owner is user #20

如何在 Rails 框架中实现多态关联:

class Book < ActiveRecord::Base
  belongs_to :owner, polymorphic: true 
end

class User < ActiveRecord::Base
  has_many :books, as: :owner
end

class Client < ActiveRecord::Base
  has_many :books, as: :owner
end

然后你可以通过以下几行找到一本书的所有者:

book = Book.first
book.owner # => return the owner of the book, can be either Client or User
于 2013-09-17T20:44:16.443 回答
0

这是 Rails 中的一个示例,模型名称更简单:

class Comment
  belongs_to :commentable, polymorphic: true
end

class Article
  has_many :comments, as: :commentable
end

class Photo
  has_many :comments, as: :commentable
end

我认为这里的关系是不言自明的。有关多态性和 Rails 的更多信息,请点击此处

于 2013-09-17T20:44:04.403 回答