🧑‍🏭

【備忘録】Railsで使う書き方⑥~delegate~

2022/06/27に公開

気がついたら大分間があいてしまいました…

delegate

https://railsguides.jp/active_support_core_extensions.html#メソッドの委譲

こんなコードがありました。(上のURLの例を元に書いています)

model.rb
class User < ApplicationRecord
  has_one :profile
end

class Profile < ApplicationRecord
  belongs_to :user
end

user = User.new(...)
user_profile_address = user.profile.address #←これが何度も出でくる

何度も同じコードが出てくることはメンテナンスも大変になるし、美しくありません。

そこでdelegateを使用します。

model.rb
class User < ApplicationRecord
  has_one :profile
  
  delegate :address, to: :profile
end

class Profile < ApplicationRecord  
  def address
    profile.address
  end
end

user = User.new(...)
user_profile_address = user.address 

このように記述することで記述量を減らすことができます。

delegateの追加情報

オプションとしてprefixをつけることが可能です。

model.rb
class User < ApplicationRecord
  has_one :profile
  
  delegate to: :method_name
  1. delegate :address, to: :profile, prefix: :true
  2. delegate :address, to: :profile, prefix: :admin
end

class Profile < ApplicationRecord  
  def address
    profile.address
  end
end

user = User.new(...)
1.user_profile_address = user_address 
2.user_profile_address = admin_address 

allow_nilをつけることも可能です。
ぼっち演算子のようにnilを返すことができます。

Discussion