Polymorphic association in Rails 5

邀请码这种需求比较常见,邀请注册,邀请使用系统中某种功能等场景。那么在 RAils 系统中设计思路是怎样的呢?

多态关系

Rails 指南中的描述:

With polymorphic associations, a model can belong to more than one other model, on a single association

意思就是,一般情况下在 model 通过一个 belong_to 只能表明与另外一个 model 有一对xx 关系。而通过多态则通过一个 belong_to 可与多个 model 产生关联关系。举个例子:picture model 既属于 employee model ,也属于 product model 。

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

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

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

多态在 Rails 项目业务中的具体实现

rails 命令生成多态 model

rails g model invitation invatable:references{polymorphic}:index code:string

生成数据库迁移文件和 Invitation model , 打开 model 会看到同时插入了这行代码

# 迁移文件
class CreateInvitations < ActiveRecord::Migration[5.0]
  def change
    create_table :invitations do |t|
      t.references :invatable, polymorphic: true, index: true
      t.string :code
      t.timestamps
    end
   end
end

# invitation model
belongs_to :invatable, polymorphic: true

这里讨论的业务场景是资产账户系统,如果想要把验证码跟 user model 关联,那么在 user model 中添加 has_one :invitation, as: :invatable, 另外如果某种资产需要邀请码才能添加,那么在 account model 中添加 has_one :invitation, as: :invatable 这时 invitation model 一个 belong_to 属于多个 model 就体现出来了。

关于 :as 参数的描述:

Setting the :as option indicates that this is a polymorphic association. Polymorphic associations were discussed in detail earlier in this guide.

那么 invitation model 的实例对象或者与 invitation model 关联的 model 实例对象可以像其他 model 关联关系一样调用了,在这里可以这样调用:

@invitation.invatable // 调用了与 @invitation 记录关联的其他 model 记录关联的记录
@account.invitation.create!(code: xxxx)  //通过 @account 对象新建一个与之关联的 invitation 记录

推荐阅读:

0 条评论
您想说点什么吗?