国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Ruby類繼承、抽象類、類拓展混入、代理類實例

2019-10-26 19:24:24
字體:
來源:轉載
供稿:網友

總結一下工作中遇到的類擴展:

1、類繼承:

當多個類公用很多方法的時候可以將公用方法部分抽取出來,需要的類做相關繼承。

例子:

代碼如下:
class A < ActiveRecord::Base
    def a
        p "it was a "
    end
end

class B<A
end

class C<A
end

B.new.a #=>"it was a "
C.new.a #=>"it was a "

2、抽象類

當多個類要繼承一個類時,用第一種方法,會遇到一個問題。
(引用一個別人的注解來描述抽象類的運用吧https://ihower.tw/rails4/activerecord-others.html)

單一表格繼承STI(Single-table inheritance)

如何將物件導向中的繼承概念,對應到關聯式資料庫的設計,是個大哉問。Rails內建了其中最簡單的一個解法,只用一個資料表儲存繼承體系中的物件,搭配一個type欄位用來指名這筆資料的類別名稱。

要開啟STI功能,依照慣例只要有一個欄位叫做type,型態字串即可。假設以下的posts資料表有欄位叫做type,那麼這三個Models實際上就會共用posts一個資料表,當然,還有這兩個子類別也都繼承到父類別的validates_presence_of :subject:
代碼如下:
class Post < ActiveRecord::Base 
    validates_presence_of :subject 
end 
 
class GuestPost < Post 
end 
 
class MemberPost < Post 
end 

讓我們進入rails console實驗看看,Rails會根據你使用的類別,自動去設定type欄位:

代碼如下:
post = GuestPost.create( :subject => "guest")
post.type # "GuestPost"
post.id # 1
post = MemberPost.create( :subject => "member" )
post.id # 2
post.type # "MemberPost"
GuestPost.last # 1

很遺憾,也因為這個慣例的關係,你不能將type這麼名字挪做它用。
STI最大的問題在於欄位的浪費,如果繼承體系中交集的欄位不多,那麼使用STI就會非常的浪費空間。如果有較多的不共用的欄位,筆者會建議不要使用這個功能,讓個別的類別有自己的資料表。要關閉STI,請父類別加上self.abstract_class = true
代碼如下:
class Post < ActiveRecord::Base 
    self.abstract_class = true 
end 
 
class GuestPost < Post 
end 
 
class MemberPost < Post 
end 

這裡的GuestPost和MemberPost就需要有自己的Migrations建立guest_posts和member_posts資料表。

你還可以在某個類中,引入多個依賴
代碼如下:
class Dependency<Post 
    require_dependency 'guestpost' 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 齐河县| 泰顺县| 玉山县| 伊吾县| 苗栗县| 瑞金市| 新乐市| 叙永县| 高阳县| 潢川县| 牟定县| 奉贤区| 胶州市| 应城市| 璧山县| 盐亭县| 柘城县| 林甸县| 延寿县| 宁晋县| 军事| 辽阳县| 博客| 长泰县| 林口县| 威远县| 繁昌县| 合水县| 汶上县| 镇江市| 东兰县| 宁城县| 宁远县| 沈阳市| 大方县| 社会| 工布江达县| 阳山县| 社旗县| 惠州市| 常州市|