Help us understand the problem. What is going on with this article?

Railsの便利なメソッドたち

More than 1 year has passed since last update.

今回はRailsの便利なメソッドをまとめました。
みなさんのRailsライフのお役に立てれば幸いです。 :pray:

Object

try

レシーバーがメソッドを実行できる場合にのみメソッドを実行し、実行できない場合にはnilを返します。
レシーバーがnilである可能性があるが、もしnilではない場合にはレシーバーのメソッドを使いたい場合には下記のように記載することが多いと思います。

name = @person ? @person.name : 'no_name'

tryを使うとよりシンプルに記載できます。

name = @person.try(:name) || 'no_name'

Rubyのぼっち演算子(&.)との違いは、 メソッドの実行条件にあります。
tryはメソッドが実行できる場合には実行します が、 "&."はレシーバーがnilでない場合にメソッドを実行します。

# レシーバーがnilの場合(挙動は同じ)
nil&.to_s
# => nil
nil.try(:to_s)
# => nil


# レシーバーがnilではない場合(挙動は同じ)
10&.to_s
# => "10"
10.try(:to_s)
# => "10"


# レシーバーがnilではないが、未定義のメソッドを実行する場合(挙動は異なる)
10.try(:hoge)
# 実行できないメソッドのためnilが返される
# => nil

10&.hoge
# レシーバー(10)はnilではないため、メソッドを実行しようとする
# => NoMethodError: undefined method `hoge' for 10:Integer

presence

レシーバーがnilではない場合にレシーバーの値を返します。
レシーバーに対してpreset?が真の場合にはレシーバーの値を返し、偽の場合にはnilを返します。

オブジェクトの値がnilかどうかによって変数へ格納する値が変わる処理を記載する場合には下記のように記載することが多いと思います。

name = params[:name].present? ? params[:name] : 'no_name'

presenceを使うとよりシンプルに記載できます。

name = params[:name].presence || 'no_name'

presence_in

レシーバーの値が指定した配列の中にある場合にレシーバーの値を返します。
presenceの配列版ですね。

配列内にオブジェクトが

pet = %w(dog cat fish).include?(params[:pet]) ? params[:pet] : 'no_pet'
pet = params[:pet].presence_in %w(dog cat fish) || 'no_pet'

ActiveRecord

pluck

テーブルから任意のカラムの配列を取得します。
pluck実行時のSQLにおいて、SELECT句はpluckで指定したカラムのみを取得するのでmapメソッドを使うよりも高速に配列を取得できます。

User.pluck(:id)
# SELECT users.id from users
# => [1, 2, 3, 4, 5]

ただしpluck実行時には必ずSQLが発行されるため、既にインスタンス化されたオブジェクトから指定のカラムの配列を取得する場合にはmapを使った方が効率的です。

# pluckの場合
user_ids = users.pluck(:id)
# 無駄なSQLが発行される
# SELECT users.id from users
# => [1, 2, 3, 4, 5]

# mapの場合
user_ids = users.map(&:id)
# => [1, 2, 3, 4, 5]

参考

あまり知られてないRuby/Railsの便利メソッド5つ(翻訳)
Railsエンジニアならこれだけは知っておけっていう便利メソッド
Rails 深い階層のnilチェックまとめ try &. dig
Ruby の &. と #try の違い

合わせて読みたい

Rubyの便利なメソッドたち

yu-croco
backendエンジニアです。仕事ではAWS, Scala on DDDが中心で、たまにRaspberry Piも触ります。発信内容は個人の見解です。
koska
原価計算をテクノロジーで刷新する
https://www.koska.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした