隨筆-167  評論-65  文章-0  trackbacks-0
          多態關聯 也叫虛擬關聯, 其實 表是不存在的。。。不像 :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)




          write by feng
          posted on 2009-08-12 17:06 fl1429 閱讀(2384) 評論(0)  編輯  收藏 所屬分類: Rails
          已訪問數:
          free counters
          主站蜘蛛池模板: 佳木斯市| 个旧市| 高淳县| 虹口区| 温州市| 巢湖市| 安达市| 宁城县| 瑞丽市| 焦作市| 祥云县| 和硕县| 肇源县| 民乐县| 启东市| 靖江市| 莱州市| 天门市| 漯河市| 波密县| 平江县| 靖安县| 涪陵区| 太康县| 莲花县| 同江市| 承德市| 天峻县| 封丘县| 吉安县| 宜兰市| 宁化县| 微博| 遂溪县| 绥芬河市| 宁强县| 上栗县| 宣威市| 和平区| 新巴尔虎左旗| 荃湾区|