什么是多态关联?

时间:2013-09-17 20:35:35

标签: ruby-on-rails

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

< p>该术语是否描述了例如

的情况
  • web_post_country
    • web_post (作为主题)&gt; 0或1个国家
    • 国家 0或更多web_posts
    • 描述
  • web_post_country
    • web_post (作为其主题) 0或1个区域
    • 区域 0或更多web_posts
    • 描述
  • region_country
    • 区域位于 1个国家/地区
    • 国家/地区 0个或更多地区

? (这些实现总是有点棘手)。

一旦我知道 ,我就会准备好在这里研究问题和答案关于第二个问题: 如何 在Rails中 实施

希望这是这个论坛的范围不太远......我的最终目标是学习Rails实现的多态关联。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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的更多信息here