はじめに
こんにちは株式会社のナオキです!
今回は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の便利なメソッドの紹介をしました!
まだ使ったことのないメソッドがあればぜひ使用してみてください。
コード量を減らすことができ、可読性があがります!
ISSEN 
