Ruby
Rails
if文
三項演算子

Ruby on Rails 三項演算子で if 文がスッキリ書ける


結論

if文だと5行で書くところ、三項演算子を使うと1行で書けることを知ったのでメモしておきます。

if文だと

@question = Question.find(params[:id])

if @question.titles.present?
@title = @question.titles.first
else
@title = @question.titles.build
end

三項演算子なら

@question = Question.find(params[:id])

@title = @question.titles.present? ? @question.titles.first : @question.titles.build

となります。



補足説明



  • QuestionモデルTitleモデル が1対多の関係


    • has_many :titles

    • belongs_to :question



  • present?



nil, "", " "(半角スペースのみ), , {}(空のハッシュ) のときにfalseを返します。


Railsドキュメント : 真偽判定


三項演算子とは?

条件 ? trueの時の処理 : falseの時の処理

つまり今回の場合

@question = Question.find(params[:id])

@title = @question.titles.present? ? @question.titles.first : @question.titles.build


  • 条件 @question.titles.present?

    question_id に紐づいた titles にデータがあるか?

  • true なら @question.titles.first

    保存されている1つ目の値のデータを取得

  • false なら @question.titles.build

    新規にデータを作成

となります。


まとめ

上記だけ見れば if 文でも良さそうですが、今回同じような @question.~.present? を計4つ作るので、三項演算子を使って4行にまとめました。

今回は三項演算子を使った方がはるかにスッキリかつ分かりやすく書けましたが、1行で書くことで分かりにくくなることもあると思うので、if 文を使うかはその時々での判断が必要かと思います。




上記の内容で何かおかしなところがありましたらご指摘お願いいたします。