こんにちは、プレイライフの熊崎です!
昨日の夜食べたラーメンのせいで、若干胃もたれ気味です。
学生の頃はラーメン+ライスでも全然平気だったのに、、、
時の流れを感じますね笑
そんな僕の話は置いておいて、delegateについての記事を書いていきたいと思います。
deledateとは
delegateマクロを使って、メソッドを簡単に委譲できます。
https://railsguides.jp/active_support_core_extensions.html?version=6.0#delegate
→ あるクラスに存在するメソッドを他のクラスで使用できるようにする
どんな時に使用するか?
関連付けられているモデルのメソッドを直接使用したいとき。
基本の使い方
sample.rb
class SampleUser < ApplicationRecord
has_one :sample_plan
# delegateには複数のメソッドを指定できる。
delegate :free_plan?, to: :sample_plan
end
# SamplePlanモデルはname属性を持っていると仮定
# 有料プランはnameが”有料プラン”
# 無料プランはnameが”無料プラン”
class SamplePlan < ApplicationRecord
belongs_to :sample_user
def free_plan?
name == "無料プラン"
end
end
# ユーザーが無料プランかどうかを確認したい時
# delegateを使わないとこんな感じ。冗長だしパッと見で意味がわかりづらい。
sample_user.sample_plan.free_plan?
# delegateを使用することで、SamplePlanモデルのメソッドを直接実行できる。簡潔だし、意味も明快
sample_user.free_plan?
オプション
:allow_nil
上記の例で、あるsample_userに、sample_planが紐づいていない場合sample_user.free_plan?
を呼び出すとNoMethodError
を返す。
allow_nil: true
にすることで、nilを返すようにできる。
:prefix
メソッド名を変更したいときに使用する。
sample.rb
class SampleUser < ApplicationRecord
has_one :sample_plan
delegate :free?, to: :sample_plan, prefix: :plan
end
# SamplePlanモデルはname属性を持っていると仮定
# 有料プランはnameが”有料プラン”
# 無料プランはnameが”無料プラン”
class SamplePlan < ApplicationRecord
belongs_to :sample_user
def free?
name == "無料プラン"
end
end
# ユーザーが無料プランかどうかを確認したい時
sample_user.sample_plan.free?
# prefix: :planとしたことで、free?メソッドの名前がplan_free?に変更された。
sample_user.plan_free?
まとめ
- delegateを使用することで、関連するモデルのメソッドを直接参照できる。
- delegateを使用することで、より可読性の高いコードを書くことができる。