条件にあてはまるデータを取得する
「沢山あるデータの中から特定のデータのみを取り出したいっ!」
そんな時はwhereメソッドを使うと便利ですよね。素晴らしいメソッドや・・・。感謝。
ただ、 whereメソッドを使った場合
指定したモデルのインスタンスではないのでそのままデータを利用できない
というこころが非常にむづかしいのです。
他の方も書かれているので、自分なりにまとめた物を書いていきます。
試しに、こんな物を作ってみました。
checks = Product.where(z_code: 1039)
puroductモデルの中で「z_code」の値が「1039」のデータを見つけてきて!
出てきた答えがこんな物でした。
>> checks
=> #<ActiveRecord::Relation [
#<Product id: 2, name: "りぼん", z_code: 1039, num: 3, release: "3", customer_id: 8, created_at: "2020-12-03 10:33:11", updated_at: "2020-12-03 10:33:11">,
#<Product id: 349, name: "りぼん", z_code: 1039, num: 1, release: "3", customer_id: 9, created_at: "2020-12-04 01:20:38", updated_at: "2020-12-04 01:20:38">
]>
ん?なにこれ?
この中で、id:2のnum(冊数)だけを取り出したいのだけど、どうすればいいのだろう・・・。
この後、5時間ぐらいに渡りトライ&エラーを繰り返すハメに・・・。
to_a
to_aメソッドとは、レシーバー自身を返すメソッドで、
Arrayのサブクラス(Arrayクラスを継承しているクラス)に対し使用した場合は、配列に変換されたものを返すそうです。
よく範囲オブジェクトを、配列に変換する時に使用される様です。
to_aの書き方
to_aメソッドは、以下のように使用します。
object.to_a
オブジェクトが配列の時は、配列自身を返しますし
範囲オブジェクト(例えば、1..5など)の場合は、配列に変換したものを返します。
hashに対しても使用することが可能で、2次元の配列に変換されたものを返します。
と言う事で、早速試してみます。
>> checks.to_a
=> [
#<Product id: 2, name: "りぼん", z_code: 1039, num: 3, release: "3", customer_id: 8, created_at: "2020-12-03 10:33:11", updated_at: "2020-12-03 10:33:11">,
#<Product id: 349, name: "りぼん", z_code: 1039, num: 1, release: "3", customer_id: 9, created_at: "2020-12-04 01:20:38", updated_at: "2020-12-04 01:20:38">
]
よしよし、ActiveRecord::Relationが外れて、ただの配列になってくれた。神よ!!
後はid:2のnumを取り出すだけだぜぇ〜・・・。(悪い顔)
>> (checks.to_a)[2].num
NoMethodError: undefined method `num' for nil:NilClass
はぅ!!
どう言う事やねん・・・。
(オブジェクト.to_a)[欲しいid].求めるカラム名
データ2個しか出てないないのに、
(checks.to_a)[2].num = 3番目のデータ出してって言ってもそりゃダメですよね。
(*番号は0,1,2,3・・・って感じで0から始まります。)
と言う事で
>> (checks.to_a)[0].num
=> 3
抽出できた!
宿題は山積み
問題は解けたのですが
- ActiveRecord::Relationってそもそもなんなの?
- レシーバー自身を返すってなに?
とわからない事が逆に増えてしまいました・・・。
よろしければ、こう言う意味だよと教えていただけると
嬉しくて小躍りします。