概要

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