最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2015年01月04日 09:18:32   投稿:junjie  
這篇文章主要介紹了Ruby類繼承、抽象類、類拓展混入、代理類實例,本文對這幾種類擴展方法分別給出了代碼實例,需要的朋友可以參考下

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

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)

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

要開啟STI功能,依照慣例只要有一個欄位叫做type,型態(tài)字串即可。假設以下的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會根據(jù)你使用的類別,自動去設定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' 
    require_dependency 'memberpost' 
end 

3、類拓展混入

ruby的類是單繼承的,要實現(xiàn)多繼承的功能需要用mixin(參合模式)的方式,即類拓展混入來實現(xiàn)。例子:

復制代碼 代碼如下:

module Extract 
  def self.included(base) 
     base.extend(ClassMethods) 
  end 
  module ClassMethods 
     def a 
        p "it was a " 
     end 
  end 
end   
 
class A<ActiveRecord::Base 
  include Extract 
end 
 
A.new.a  #=>"it was a" 

4、代理類

當某個功能是比較復雜的,當然寫再lib中,作為一個面向函數(shù)的方法去處理很簡單,也可以用代理類的方式實現(xiàn)面向對象的調(diào)用。

例子:

復制代碼 代碼如下:

class A<ActiveRecord::Base
 def generate_schedule
    generator =  Generator::ExcelGenerator.new(self)
    generator.generate_schedule
  end
end

module Generator
  class ExcelGenerator

    attr_reader :excel,:workbook,:a,:worksheet
    attr_accessor :styles

    def initialize(a)
      @excel ||= Axlsx::Package.new
      @workbook ||= @excel.workbook
      @worksheet = @workbook.add_worksheet(:name => '測試生成一個excel文件')
      @a ||= a
      @styles ||= Hash.new
    end
   
    def generate_schedule
        #excel內(nèi)容的具體定義
    end

  end
end

A.new.generate_schedule 就可以通過代理類ExcelGenerator實現(xiàn)一個A的類實例方法generate_schedule

當然也可以通過include 一個model的方式實現(xiàn)添加類實例方法,有時候也可以混合使用。另外使用代理類的好處在于多個類都需要相同方法的時候可以定義共同的部分,舉一個發(fā)郵件的例子:

復制代碼 代碼如下:

class A<ActiveRecord::Base
    include SendEmail
end

class B<ActiveRecord::Base
    include SendEmail
end

實現(xiàn)引入模塊:

復制代碼 代碼如下:

module SendEmail
    #include this module to class::A and B
    #use like that--  A.first.send_email
    def send_email
      Email.call_email(self)
    end
end

實現(xiàn)代理類:

復制代碼 代碼如下:

class Email < ActionMailer::Base
  default :from => "test@email.com"

  def self.call_email(obj)
     define_method "#{obj.state}" do |obj|
       @obj = obj
       mail(:to => @obj.email, :subject => "XX標題" )
     end
     send("#{obj.state}").deliver
     #根據(jù)不同對象obj.state得到不同狀態(tài)下,定義不同方法,然后send派發(fā)調(diào)用相關對象狀態(tài)的模板。
  end
    
end

RUBY很靈活當然還有很多其他的方法實現(xiàn)更多的方式,以后再慢慢總結。

相關文章

  • Ruby元編程小結

    Ruby元編程小結

    這篇文章主要介紹了Ruby元編程小結,元編程是可以在運行時動態(tài)的操作語言結構(如類、模塊、實例變量等)的技術,需要的朋友可以參考下
    2015-01-01
  • ruby中的雙等號==問題詳解

    ruby中的雙等號==問題詳解

    Ruby里面有4種比較方法,equal?, eql?, ==, ===,而且在不同的類里面表現(xiàn)的很不一樣。在使用的時候也特別容易搞糊涂。 本文先給大家講述一下==號的用法及使用中應該注意的地方
    2016-02-02
  • ruby 流程控制 方法

    ruby 流程控制 方法

    ruby 流程控制 方法...
    2007-11-11
  • ruby ftp封裝實例詳解

    ruby ftp封裝實例詳解

    這篇文章主要介紹了ruby ftp封裝實例詳解的相關資料,需要的朋友可以參考下
    2017-05-05
  • Ruby Gems更換淘寶源方法

    Ruby Gems更換淘寶源方法

    這篇文章主要介紹了Ruby Gems更換淘寶源方法,官方源有時不穩(wěn)定,國內(nèi)淘寶做了一個鏡像,本文講解更換成淘寶源的方法,需要的朋友可以參考下
    2015-01-01
  • 詳解Lua中的表的概念及其相關操作方法

    詳解Lua中的表的概念及其相關操作方法

    這篇文章主要介紹了Lua中的表的概念及其相關操作方法,是Lua入門學習中的基礎知識,需要的朋友可以參考下
    2015-05-05
  • 詳解Ruby on Rails中的mailer相關使用

    詳解Ruby on Rails中的mailer相關使用

    這篇文章主要介紹了詳解Ruby on Rails中的mailer相關使用,主要針對其相關的編程風格給出建議,需要的朋友可以參考下
    2015-08-08
  • Ruby中Hash的11個問題解答

    Ruby中Hash的11個問題解答

    這篇文章主要介紹了Ruby中Hash的11個問題解答,本文講解了如何創(chuàng)建Hash、Hash的鍵是哪些類型、 如何給Hash賦默認的值等內(nèi)容,需要的朋友可以參考下
    2015-01-01
  • 對優(yōu)化Ruby on Rails性能的一些辦法的探究

    對優(yōu)化Ruby on Rails性能的一些辦法的探究

    這篇文章主要介紹了對優(yōu)化Ruby on Rails性能的一些辦法的一些探究,包括避免內(nèi)存密集型的應用和GC等相關問題的探討,需要的朋友可以參考下
    2015-11-11
  • Ruby語言建立Web服務器的過程詳解

    Ruby語言建立Web服務器的過程詳解

    這次選擇的Web服務器是Nginx,Nginx非常適合處理靜態(tài)資源,如圖片、CSS和JS文件,通過減輕應用服務器的負擔,Nginx使得Ruby?on?Rails應用能夠更高效地運行,這篇文章主要介紹了Ruby語言建立Web服務器,需要的朋友可以參考下
    2024-06-06

最新評論

安徽省| 启东市| 宁明县| 灵山县| 平度市| 承德市| 星子县| 河北省| 罗源县| 彰化县| 三门峡市| 鸡泽县| 武山县| 石首市| 黎平县| 剑河县| 南召县| 亳州市| 长岛县| 天峨县| 福建省| 韩城市| 耒阳市| 益阳市| 嘉荫县| 德钦县| 祁阳县| 潞城市| 治县。| 边坝县| 临澧县| 平山县| 浦城县| 安仁县| 道孚县| 尖扎县| 丹东市| 郓城县| 涟源市| 信宜市| 凤凰县|