0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

delegateについて

Posted at

こんにちは、プレイライフの熊崎です!

昨日の夜食べたラーメンのせいで、若干胃もたれ気味です。
学生の頃はラーメン+ライスでも全然平気だったのに、、、
時の流れを感じますね笑

そんな僕の話は置いておいて、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を使用することで、より可読性の高いコードを書くことができる。

参考URL

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?