pluckメソッドの使い勝手が良かったので自分なりにメモとして残しておきます
公式ドキュメント
公式ドキュメントではpluckメソッドは以下のように定義されています
pluckは、1つのモデルで使用されているテーブルからカラム (1つでも複数でも可) を取得するクエリを送信するのに使用できます。引数としてカラム名のリストを与えると、指定したカラムの値の配列を、対応するデータ型で返します。
使い方
User.pluck(:name)
=> ["モロヤン", "k蓮", "kouri", "ザキヤマ", "ふぅ", "山ちゃん。",
"やんまー", "もとき", "字音", "江南スタイル", "やばめ", "オードリー",
"karin", "march", "水鶏", "ルイルイ", "はぴたん", "keith_forest",
"ヤッピー", "ゲストユーザー", "レイマン"]
上記のようにUserモデルのカラム(:name)を指定するとnameカラムを配列に入れて返してくれます。
また引数を2つ選択すると以下のようになります
User.pluck(:name,id)
=> [["モロヤン", 2], ["k蓮", 3], ["kouri", 4], ["ザキヤマ", 5], ["ふぅ", 6],
["山ちゃん。", 7], ["やんまー", 8], ["もとき", 9], ["字音", 10], ["江南スタイル", 11],
["やばめ", 12], ["オードリー", 13], ["karin", 14], ["march", 15], ["水鶏", 16], ["ルイルイ", 17],
["はぴたん", 20], ["keith_forest", 18], ["ヤッピー", 1], ["ゲストユーザー", 21], ["レイマン", 19]]
指定したカラム2つが一つの配列になり帰ってきます。またこれは以下のコードと同じオブジェクトが返ってくるなのでとてもスッキリしたと言えますね。
User.select(:id, :name).map { |c| [ c.name, c.id] }
ちょっとした違いとしてpluck
の場合はモデルオブジェクト(Userのインスタンス)は作られませんが,select
だと(いったん)作られます。
@scivolaさんご指摘ありがとうございます。
すごい便利なpluckメソッドですが
公式ドキュメントでは以下の記載があります
pluckは、selectなどのRelationスコープと異なり、クエリを直接トリガするので、その後ろに他のスコープをチェインすることはできません。ただし、構成済みのスコープをpluckの前に置くことはできます。
どういう意味かというと以下の記述ができないということです。
User.pluck(:name).limit(1)
pluckの後ろには記述できないということですね。
この場合は以下のようにpluckの前に記述する必要があります
User.limit(1).pluck(:name)
pluckメソッドの使い方は以上です。