以 Ruby 解釋 ActiveRecord::Migration[5.x] 宣告法


#1

之前有看到,但是一直沒寫出來:Rails 5.0 的 migration 引入這樣的寫法,類似

class Init < ActiveRecord::Migration[5.0]
  def change
    #...
  end
end

問題出現在 ActiveRecord::Migration[5.0] 新的寫法?並不是哩,寫個相同的 code 以免有人搞混了,這仰賴於 Ruby 啥鬼都可以變成回傳值的功能,這邊原始宣告的 code 在這邊,而我寫同義的 code 來做 demo 哩

class Mi
  class A
    def self.yoo
      puts 'im_a'
    end
  end

  VERSION = {:A => A}

  def self.[](flag)
    puts flag
    puts flag.class
    klass = VERSION[flag]
    raise 'fail version' unless klass
    return klass
  end
end

class Mi::B
  def self.yoo
    puts 'im_b'
  end
end
Mi::VERSION[:B] = Mi::B

class Mi::C ; def self.yoo ; puts 'im_c' ; end ; end ; Mi::VERSION[:C] = Mi::C

class Yoo < Mi[Mi::VERSION.keys.sample]
end

Yoo.yoo

上面是一個標準的隨機繼承的寫法,Array.sample 是隨機抽取的意思,而大家宣告後就去找 VERSION 註冊,而關鍵的 [ ] 只是一個找尋正確的 class 的 method 並把 class 回傳,讓 Yoo 繼承而已

okay大概就這樣唄,其實這類的做法在很多地方有,類似之前有用過的 em-websocket 之類的都有 “klass” 的用法,也就是動態挑選繼承來源哩,以上