paramsでfindするときの簡単な書き方

# めんどい(´・ω・`)
@user = User.find(params[:user_id]) if params[:user_id].present? # ①
# カンタン(`・ω・´)
@user = User.find_by_id(params[:user_id].presence) # ②
  • find(id)とfind_by_id(id)の違いは、レコードが見つからなかったときに前者がRecordNotFound例外を出すけど、後者はnilを返すだけというところ
  • params[:user_id].presenceは、params[:user_id]が存在すればそれを返して、存在しなければnilを返す。if文を書かなくて済むので便利。(`・ω・´)

追記(7/9)
上記の方法だと、params[:user_id].presenceがnilでもSQLを実行してしまいます。これは余計なSQLなので、こんな感じでどうでしょ?ご指摘いただきありがとうございます。

@user = params[:user_id].presence && User.find_by_id(params[:user_id]) # ③

params[:user_id]が存在しないとき、①の@userは未定義で、③の@userはnilとなります。また、③だとSQLが実行されません。でも、長いからなぁ…。