多态关联

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

create_table :products do |t| t.references :attachment, :polymorphic => {:default => 'Photo'} end 

将添加一个attachment_id列和一个字符串attachment_type列,其默认值为“Photo”。

这到底是什么意思?

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

两个列都可以让Rails知道关联所指的模型,你有attachment_type列(即String)(默认值是“Photo”,表名:db中的照片),attachment_id有点像该特定模型/表的外键(即照片)。

通常,这使您可以灵活地将一个模型与其他模型相关联。

以下是引用方法的文档: 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 

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

这跟说:

 create_table :products do |t| t.integer :attachment_id t.string :attachment_type, :default => 'Photo' end 

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

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

在您的示例中,看起来像Products可以附加到多种对象,其中默认类型的对象是Photo。 ( attachment_type为“Photo”, attachment_id为“photos”表中一行的id)

多态意味着它可以属于不同的对象(或不同的表中的不同记录)。 它确定的方式基于type和id字段。 如果你的关联不是多态的,它只会有一个_id字段。