モチベーション
ActiveRecordで深く潜った先の値に対して nil
のときは nil
、そうでない時は値を用いて処理する場合、 if
を用いると冗長になるし、三項演算子を利用するとめちゃくちゃ長くなる 😢
# userに紐づく、最後の賃貸契約の契約月数を取得(契約月数はnullable)
user = User.first
# if
if user.lease_contract.last&.period_months
p "#{user.lease_contract.last&.period}ヶ月"
else
nil
end
# 三項演算子
p user.lease_contract.last&.period_months ? "#{user.lease_contract.last&.period}ヶ月" : nil
何かスッキリ書く方法ないかな? 🤔
結論
then を利用するとスッキリ書けます 🖊️
# userに紐づく、最後の賃貸契約の契約月数を取得(契約月数はnullable)
user = User.first
# then
p user.lease_contract.last&.period_months&.then { |period_months| "#{period_months}ヶ月"}
point は period_month&.then
の部分です。
-
&.
(ぼっち演算子)はレシーバー(period_month
)がnil
の場合にnil
を戻す-
period_month
=nil
の場合はnil
が取得できる
-
- then はレシーバーをブロックとして処理し、その結果を戻す
-
period_month
の値に対して{ |period_months| "#{period_months}ヶ月"}
を実行し、nヶ月
という文字列を取得する
-