多态关联

Arc*_*Arc 8 ruby migration ruby-on-rails

如果你有多态的belongs_to关联,那么引用将添加所需的两个列:

create_table :products do |t|
  t.references :attachment, :polymorphic => {:default => 'Photo'}
end
Run Code Online (Sandbox Code Playgroud)

将添加一个attachment_id列和一个字符串attachment_type列,其默认值为"Photo".

这到底是什么意思?

Gde*_*lin 6

以下是引用方法的文档:http: //api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/TableDefinition.html#M001938

引用方法的代码如下:

497:       def references(*args)
498:         options = args.extract_options!
499:         polymorphic = options.delete(:polymorphic)
500:         args.each do |col|
501:           column("#{col}_id", :integer, options)
502:           column("#{col}_type", :string, polymorphic.is_a?(Hash) ? polymorphic : options) unless polymorphic.nil?
503:         end
504:       end
Run Code Online (Sandbox Code Playgroud)

如你看到的.它将[col] _id和[col] _type列添加到表中.

这跟说:

create_table :products do |t|
  t.integer :attachment_id
  t.string  :attachment_type, :default => 'Photo'
end
Run Code Online (Sandbox Code Playgroud)

多态关联用于将一种对象连接到多种其他对象.

一个很好的例子可能是支持标签的应用程序,其中标签可以连接到ProductsCategories.

在您的示例中,看起来像Products可以附加到多种对象,其中默认类型的对象是Photo.(attachment_type将是"照片",并且attachment_id将是"照片"表中一行的ID)


Ris*_*ogi 4

基本上,根据定义,多态关联增加了与许多其他 Rails ActiveRecord 模型创建关联的能力。

这两列都是为了让Rails知道关联所指的是哪个模型,你有attachment_type列(即字符串)(默认值为“Photo”,表名:数据库中的照片),attachment_id有点像该特定模型/表(即照片)的外键。

通常,这可以让您灵活地将一个模型与许多其他模型关联起来。