ActiveRecord关联关系之多态(polymorphic)

在多态关联中同一个关联可以属于多个模型

在belong_to 中指定使用多态,可以理解为创建了一个接口,供别的模型使用。
在has_one 或者 has_many 通过as参数声明要使用的多态接口

class Picture < ActiveRecord::Base
  belongs_to :imageable, polymorphic: true
end
 
class Employee < ActiveRecord::Base
  has_many :pictures, as: :imageable
end
 
class Product < ActiveRecord::Base
  has_many :pictures, as: :imageable
end

在 belongs_to 中指定使用多态,可以理解成创建了一个接口,可供任何一个模型使用。在 Employee 模型实例上,可以使用 @employee.pictures 获取图片集合。类似地,可使用 @product.pictures 获取产品的图片。

在 Picture 模型的实例上,可以使用 @picture.imageable 获取父对象。不过事先要在声明多态接口的模型中创建外键字段和类型字段:

class CreatePictures < ActiveRecord::Migration
  def change
    create_table :pictures do |t|
      t.string  :name
      t.integer :imageable_id
      t.string  :imageable_type
      t.timestamps
    end
  end
end
上面的迁移可以使用 t.references 简化:

class CreatePictures < ActiveRecord::Migration
  def change
    create_table :pictures do |t|
      t.string :name
      t.references :imageable, polymorphic: true
      t.timestamps
    end
  end
end
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,874评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,281评论 19 139
  • 受港股打新彩蛋的诱惑,我去年6月跑了几十公里的路程(我们这个城市没有代理商),好不容易地开通的富途证券账户。用了一...
    游泳的鱼_cc71阅读 5,172评论 5 16
  • 假如把世界比作一个班级,上帝是班主任的话,那巴西一定是那个最不争气的学生,这么说实在因为在占尽优势的情况下,他仍然...
    薄暮初阳阅读 1,245评论 9 8
  • 不知是因为自己老了,还是因为巨蟹的敏感,最近常常忆起过去的人和事。钱钟书说:“似乎我们总是很容易忽略当下的生活...
    滋蘭阅读 367评论 0 1