delegateとは
delegateマクロを使用すると、メソッドを簡単に委譲できます。
というものらしいです。
だいぶ無理がありますが、下記の条件のもと、delegateメソッドを使って移譲を試してみます
- Student(生徒)モデルと Address(住所)モデルがあり、生徒はそれぞれ1つの住所を持つとする
- この時、Addressモデルはcountry, prefecture, city, townなどのカラムをもっている
class Student < ApplicationRecord
has_one : address
end
class Address < ApplicationRecord
belongs_to :student
def country_name
"#{country}に住んでいます"
end
def prefecture_name
"#{prefecture}に住んでいます"
end
def city_name
"#{city}に住んでいます"
end
def town_name
"#{town}に住んでいます"
end
end
この場合生徒の住んでいる市を知りたい、とか町だけの情報を取ってきたい時があるとすると、
普通だと
student.address.city
とか student.address.town
としなければなりません。
しかし、下記のようにdelegateメソッドを使用して移譲してあげると
class Student < ApplicationRecord
has_one :address
delegate :country_name, :prefecture_name, :city_name, :town_name, to: :address
student.city_name
や student.town_name
で
生徒の市や町の情報を取得することができます。
今回の例のような形では使うことは少ないと思いますが、
複雑なメソッドを切り出したい時など、処理が複雑になってくると、
delegateメソッドは非常に使い勝手のいいメソッドだと思います。
ただ、影響範囲が見えずらくなるきっかけになるので、使いすぎには注意が必要そう。。。