rails: 多态关联(polymorphic)

关联中稍微高级一点的变体是多态关联。Rails 中的多态关联允许一个模型通过一个关联属于多个其他模型。当您有一个需要链接到不同类型的模型的模型时,这尤其有用。

例如,假设您有一个Picture模型,它可以属于Employee,因为每个模型都可以有一个 个人Product资料图片。以下是声明方式:

01 生成 Picture 模型

由于 Picture 模型需要与 EmployeeProduct 模型进行多态关联,我们需要在 Picture 模型中加入 imageable 相关字段。可以通过 rails generate model 命令来生成。

运行以下命令:

# 多态 model
rails g model Picture name imageable:references{polymorphic}

# 业务 model
rails g model Employee name
rails g model Product name

得到的 schema

  • imageable
  • polymorphic: true
class CreatePictures < ActiveRecord::Migration[8.0]
  def change
    create_table :pictures do |t|
      t.references :imageable, polymorphic: true, null: false

      t.timestamps
    end
  end
end

02 定义业务模型

生成模型后,你需要在各个模型文件中定义关联关系。

app/models/picture.rb

class Picture < ApplicationRecord
  belongs_to :imageable, polymorphic: true
end

app/models/product.rb

class Product < ApplicationRecord
  has_many :pictures, as: :imageable
end

app/models/product.rb

class Product < ApplicationRecord
  has_many :pictures, as: :imageable
end

03 使用示例

# 创建 Employee 和 Product 对象
employee = Employee.create(name: "John Doe")
product = Product.create(name: "Laptop")

# 给 Employee 和 Product 添加图片
employee.pictures.create(name: "employee_pic.jpg")
product.pictures.create(name: "product_pic.jpg")

# 获取图片的关联对象
picture = Picture.first
picture.imageable  # 这将返回关联的 Employee 或 Product 对象
rubyonrails rails polymorphic