Leon's Blogging

Coding blogging for hackers.

Ruby on Rails - Delegate 委派

| Comments

神奇語法delegate,之前就看過這個語法,不過一直搞不懂在幹什麼? 研究了之後,發現是個很magic的用法!!

Provides a delegate class method to easily expose contained objects’ public methods as your own.

說穿了其實是可以讓一個 class 直接取用另外一個關聯 class 的 method

還是看範例比較快

1
2
3
4
class Cart < ActiveRecord::Base
  has_many :line_items
  delegate :empty?, :clear, to: :line_items
end
1
2
3
class CartItem < ActiveRecord::Base
  belongs_to :cart
end

上面有兩個 model 的關係是 one-to-many 一般正常來說必須要@cart.line_items.empty? 才能夠從 cart 關聯到 cart_items 在呼叫他的方法 empty?

不過因為加上了

1
delegate :empty?, :clear, to: :line_items

所以直接呼叫 @cart.empty? 就可以回傳 @cart.cart_items.empty? 仔細觀察後,其實也就等於下面的 method (但是可以一行解決下面的語法

1
2
3
def empty?
    line_items.empty?
end

另外還可以加上 prefix: true

1
delegate :empty?, :clear, to: :line_items, prefix: true

變成直接呼叫 @cart.cart_items_empty? 沒有 . 字面上面的更加清楚!

在官方API文件上甚至可以看到 可以加上 allow_nil: true 允許 nil 甚至是 prefix 可以加上別的字,變成

1
delegate :empty?, :clear, to: :line_items, prefix: mycart

就變成 @cart.mycart_empty? 蠻酷的吧!

官方文件: delegate

  1. :to - Specifies the target object
  2. :prefix - Prefixes the new method with the target name or a custom prefix
  3. :allow_nil - if set to true, prevents a NoMethodError to be raised

Comments