rails 多态关联 (:polymorphic => true)

多态关联 也叫虚拟关联, 其实 表是不存在的。。。不像 :through => :connections 那connections的表是存在的,也可以不存在的,connections是一个关联模型

有这样一个需求,需要用到 虚拟关联

在SNS中,例如xiaonei,douban等等都有 最近好友更新的内容显示,那么这个 一般是在一个 表中,例如 叫activities 表,更新有很多种 ,例如 修改头像,发表日志,建立了好友关系,发表评论等等,。。说白了就是 一个表 关联了 多个表,那就得用到 虚拟 关联了。。

表结构:


原理:
上面有三个表,activities表(记录更新了那些操作,最重要的两个字段是item_id,和item_type,item_id是对应到关联表的主键id,item_type是对应到关联表的表对象名例如comments表就是Comment) Posts表 (用户发表文字的表,例如有发表blog的blog_id,发表论坛 topic的 topic_id,给用户留言的client_info_id,body是发表的内容),
comments表(评论表,body是评论内容,当然评论也好好多种评论,这个表里也需要关联许多表,从comments表的字段中也可以看到用了虚拟关联)

用法:
model:

activity
class Activity < ActiveRecord::Base
  ................
  belongs_to :item, :polymorphic => true
..........................
end

Comment
..................
has_many :activities, :foreign_key => "item_id" , :dependent => :destroy
..................

加上 :dependent => :destroy 是当这条评论删除时,activities 表里的记录同时被删除


或者:

has_many :activities, :as => :item , :dependent => :destroy 


那么 Post 模型 同理可得。。。。 

因为上面的 :item , 所以 activities 表里的 item_id ,  item_type 是约定俗成的。。。。。。。。。

取数据
 activity.item.body
activity 是activities表中的记录对象

ref:
http://guides.rails.info/association_basics.html
http://hideto.javaeye.com/blog/76709
http://hi.baidu.com/rainchen/blog/item/fc3a94eeb31ad62b2df53412.html
http://iceskysl.1sters.com/?action=show&id=25
http://rubycnrails.cn/articles/23 (了解:dependent=>:destroy)
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值