はじめに
Railsでコードを書いていると、関連先のオブジェクトが持っている値を取りたくなることがあります。
たとえば、User が Profile を持っていて、プロフィールの名前を取得したいとします。
user.profile.name
このように書けますが、毎回 profile を経由して呼ぶのが少し長く感じることもあります。
そんなときに使えるのが delegate です。
delegateとは
delegate は、別のオブジェクトのメソッドを、自分のメソッドのように呼べるようにするものです。
基本形
class User < ApplicationRecord
has_one :profile
delegate :name, to: :profile
end
これは「name を profile に委譲する」という意味です。
もともとは user.profile.name と書いていたものを、user.name と書けるようになります。
複数まとめて書く
delegate :name, :age, to: :profile
複数のメソッドをまとめて書くこともできます。
prefixをつける
delegate :name, to: :profile, prefix: true
この場合は、 user.name ではなくuser.profile_name と書くようになります。
nilでもエラーにしない
delegate :name, to: :profile, allow_nil: true
この場合は、profile がないときでもエラーにならず nil を返します。
最後に
Railsを書いているとたまに見かけるので、まずは「呼び出しをシンプルにするためのもの」くらいで覚えておくとよさそうです。