[Ruby]delegateメソッドの使い方
概要
Module#delegate
このメソッドを使うことで癒着を弱めてデメテルの法則に沿えるようになる
デメテルの法則
任意のオブジェクトが自分以外の構造やプロパティに対して持っている仮定を最小限にすべきであるという考え方。
以下のように、objAから他のオブジェクトを経由してメソッドやオブジェクトなどを呼び出してはいけない。
objA.objB.Method()
→オブジェクト間のやりとりを最小限に抑え、必要であれば直接やりとりをする
メリット: メンテナンスしやすくなる
メソッドの使用方法
モデルで以下のように指定
class Company < ApplicationRecord
belongs_to :owner_user
delegate :email, to: :owner_user
end
呼び出し方 company.email # company.owner_user.emailと同等
ちなみに以下の形で書くのと同等になるが、delegate を使った方がより簡潔に書ける
def name
profile.name
end
オプション
・allow_nilオプションをつけるとowner_userがnilだった場合に例外ではなくnilを返すようにできる
delegate :email, to: :owner_user, allow_nil: true
上記は以下と同義
def name
profile&.name
end
・prefixオプションでプレフィックスをつけることができる
delegate :email, to: :owner_user, prefix: true
呼び出し
company.owner_user_email
参考
Active Support コア拡張機能 - Railsガイド デメテルの法則 - Wikipedia Rails Best Practices - the Law of Demeter