【Rails】便利メソッド10選!

はじめに

こんにちは株式会社のナオキです!
今回はRailsの便利メソッドを10つ紹介します!
どれも普段からよく使用するメソッドなので、まだ使用したことのないものはこれを機に使用してみてください!

対象読者

  • Rails初学者の方
  • Railsを用いて開発を行っている方

便利メソッド10選

find_by

指定した条件に一致する最初の1件のレコードを返します。
見つからない場合はnilを返します。

user = User.find_by(email: "test@example.com")
if user
  puts user.name
else
  puts "ユーザーが見つかりませんでした"
end

似ているメソッドのfindは見つからない場合に例外を発生させますが、find_bynilを返すため、エラーを防ぎつつ分岐で扱いやすいです。

find_or_initialize_by

条件に一致するレコードがあればそのレコードを返し、なければ保存されていない新しいインスタンスを返します(データベースにはまだ保存されません)

user = User.find_or_initialize_by(email: "test@example.com")
user.name ||= "新規ユーザー"
user.save

似ているメソッドで他にもfind_or_create_byがありこちらは、なければ作成し保存してから返すメソッドです。

exists?

条件に一致するレコードが存在するかどうかをtrue/falseで返します。

if User.exists?(email: "test@example.com")
  puts "ユーザーは存在します"
else
  puts "ユーザーは存在しません"
end

where.missing

指定した関連(アソシエーション)が存在しないレコードを取得できます。関連がnilまたは空の場合に絞り込むのに便利です。
例として、投稿(Post)とコメント(Comment)が一対多の関係だとします。
以下はコメントが一件もない投稿だけを取得できます。

Post.where.missing(:comments)

pluck

指定したカラムの値だけを配列で取得できます。

user_names = User.pluck(:name)
# => ["田中太郎", "佐藤一郎", ...]

select

指定したカラムだけをデータベースから取得して、オブジェクトとして返します。

users.select(:id, :name).each do |user|
  puts user.id      # OK
  puts user.name    # OK
  puts user.email   # NG → 指定していないemailにはアクセスできません。
end

find_each

大量のレコードを一括で読み込まずに、デフォルトでは1000件ずつ取得して処理を行います。
似ているメソッドのeachは全件を一括で読み込むため、データ量が多い場合メモリを大幅に消費してしまします。
その点、find_eachはデフォルトでは1000件ずつ読み込むため、データ量が多い場合でも安定した処理が可能になります

User.find_each do |user|
  user.update(params)
end

取得件数を変更したい場合は以下のようにbatch_sizeを指定します。

User.find_each(batch_size: 500) do |user|
  user.update(params)
end

present?

値がnilや空文字、空配列などではないかを判定し、空でなければtrueを返します。
条件分岐にてよく使われます。
以下はユーザー(User)をキーワード(Keyword)で検索する場合の例です。

if params[:keyword].present?
  # キーワードが存在する場合の処理
  @users = User.where("name LIKE ?", "%#{params[:keyword]}%")
else
  # キーワードが空 or nil の場合の処理
  @users = User.all
end

compact_blank

配列やハッシュからnilや空文字、空配列の要素を取り除くことができます。

["", nil, "hello"].compact_blank
# => ["hello"]

{ name: "Taro", email: "", phone: nil }.compact_blank
# => { name: "Taro" }

似たようなメソッドでcompactメソッドがありますが。
compactはnilのみを取り除きます。空文字や空配列も取り除きたい場合にはcompact_blankを使いましょう。

where.not

指定した条件に一致しないレコードを取得できます。
以下の例は商品の在庫が0でないのレコードを取得しています。

products = Product.where.not(stock: 0)

whereは指定した条件のレコードを取得できるメソッドなので、その逆になります。

おわりに

今回はRailsの便利なメソッドの紹介をしました!
まだ使ったことのないメソッドがあればぜひ使用してみてください。
コード量を減らすことができ、可読性があがります!