1.なぜこの記事を作ったのか
学習中に、配列関係のメソッドを使用する機会が増えました。ロジックのインプットのみしかしておらず、理解が怪しい部分があり、検証するなら記事にして見直せる様にしようと思いました。
2.環境
- ruby 3.2.2
- Rails 7.1.2
3.pluckメソッド(カラムを配列に変換)
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"
となっており、全要素を取得してしまうので「メモリのムダ使い」になってしまう。