はじめに
こんにちは株式会社のナオキです!
今回はRailsの便利メソッドを10つ紹介します!
どれも普段からよく使用するメソッドなので、まだ使用したことのないものはこれを機に使用してみてください!
- Rails初学者の方
- Railsを用いて開発を行っている方
便利メソッド10選
指定した条件に一致する最初の1件のレコードを返します。
見つからない場合はnil
を返します。
user = User.find_by(email: "test@example.com")
if user
puts user.name
else
puts "ユーザーが見つかりませんでした"
end
似ているメソッドのfind
は見つからない場合に例外を発生させますが、find_by
はnil
を返すため、エラーを防ぎつつ分岐で扱いやすいです。
条件に一致するレコードがあればそのレコードを返し、なければ保存されていない新しいインスタンスを返します(データベースにはまだ保存されません)
user = User.find_or_initialize_by(email: "test@example.com")
user.name ||= "新規ユーザー"
user.save
似ているメソッドで他にもfind_or_create_by
がありこちらは、なければ作成し保存してから返すメソッドです。
条件に一致するレコードが存在するかどうかをtrue
/false
で返します。
if User.exists?(email: "test@example.com")
puts "ユーザーは存在します"
else
puts "ユーザーは存在しません"
end
指定した関連(アソシエーション)が存在しないレコードを取得できます。関連がnil
または空の場合に絞り込むのに便利です。
例として、投稿(Post
)とコメント(Comment
)が一対多の関係だとします。
以下はコメントが一件もない投稿だけを取得できます。
Post.where.missing(:comments)
指定したカラムの値だけを配列で取得できます。
user_names = User.pluck(:name)
# => ["田中太郎", "佐藤一郎", ...]
指定したカラムだけをデータベースから取得して、オブジェクトとして返します。
users.select(:id, :name).each do |user|
puts user.id # OK
puts user.name # OK
puts user.email # NG → 指定していないemailにはアクセスできません。
end
大量のレコードを一括で読み込まずに、デフォルトでは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
値がnilや空文字、空配列などではないかを判定し、空でなければtrue
を返します。
条件分岐にてよく使われます。
以下はユーザー(User
)をキーワード(Keyword
)で検索する場合の例です。
if params[:keyword].present?
# キーワードが存在する場合の処理
@users = User.where("name LIKE ?", "%#{params[:keyword]}%")
else
# キーワードが空 or nil の場合の処理
@users = User.all
end
配列やハッシュからnil
や空文字、空配列の要素を取り除くことができます。
["", nil, "hello"].compact_blank
# => ["hello"]
{ name: "Taro", email: "", phone: nil }.compact_blank
# => { name: "Taro" }
似たようなメソッドでcompact
メソッドがありますが。compact
はnilのみを取り除きます。空文字や空配列も取り除きたい場合にはcompact_blank
を使いましょう。
指定した条件に一致しないレコードを取得できます。
以下の例は商品の在庫が0でないのレコードを取得しています。
products = Product.where.not(stock: 0)
where
は指定した条件のレコードを取得できるメソッドなので、その逆になります。
おわりに
今回はRailsの便利なメソッドの紹介をしました!
まだ使ったことのないメソッドがあればぜひ使用してみてください。
コード量を減らすことができ、可読性があがります!