0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Ruby on Rails 配列関係のメソッドを理解する(pluckメソッド)

Posted at

1.なぜこの記事を作ったのか

 学習中に、配列関係のメソッドを使用する機会が増えました。ロジックのインプットのみしかしておらず、理解が怪しい部分があり、検証するなら記事にして見直せる様にしようと思いました。

2.環境

  • ruby 3.2.2
  • Rails 7.1.2

3.pluckメソッド(カラムを配列に変換)

テーブル作成
fruitsテーブル.jpg

1.挙動の確認

console
irb(main)> Fruit.pluck(:name)
=> ["apple", "pear", "lemon"]
console
irb(main)> Fruit.pluck(:color)
=> ["red", "green", "yellow"]

指定した引数を配列にしていることが分かった。

2.引数を複数指定した場合

console
irb(main)> Fruit.pluck(:name, :color)
=> [["apple", "red"], ["pear", "green"], ["lemon", "yellow"]]

引数を複数にした場合、二次元配列になっていることが分かった。

3.メソッドチェーンの位置に注意

console
irb(main):002> Fruit.pluck(:name).limit(2)
(irb):2:in `<main>': undefined method `limit' for ["apple", "pear", "lemon"]:Array (NoMethodError)

配列に対してlimitメソッドを実行してしまい、NoMethodErrorが発生。
pluckメソッドは配列を返す為、クエリメソッドとメソッドチェーンする際は後ろに書く必要がある。
クエリメソッドとはDBからデータを取得するメソッド(order, find, where等)。

console
irb(main)> Fruit.limit(2).pluck(:name)
=> ["apple", "pear"]

前後を逆にすることで上手く読み出す事が出来た。

4.SQLの発行について

console
irb(main):011> Fruit.pluck(:name)
  Fruit Pluck (0.3ms)  SELECT "fruits"."name" FROM "fruits"
=> ["apple", "pear", "lemon"]

SELECT "fruits"."name" FROM "fruits"となっており、fruitsテーブルのnameカラムのみを取得する。なのでメモリの無駄使いをすることなく取得出来ていると分かった。

console
irb(main):012> Fruit.all.map(&:name)
  Fruit Load (0.4ms)  SELECT "fruits".* FROM "fruits"
=> ["apple", "pear", "lemon"]

こちらの場合だと、SELECT "fruits"."*" FROM "fruits"となっており、全要素を取得してしまうので「メモリのムダ使い」になってしまう。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?