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 记录
推荐阅读: