LoginSignup
0
2

More than 3 years have passed since last update.

【Rails】ActiveRecord::Relationから欲しい値を取出す方法。

Last updated at Posted at 2020-12-04

条件にあてはまるデータを取得する

「沢山あるデータの中から特定のデータのみを取り出したいっ!」
そんな時は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ってそもそもなんなの?
  • レシーバー自身を返すってなに?

とわからない事が逆に増えてしまいました・・・。
よろしければ、こう言う意味だよと教えていただけると
嬉しくて小躍りします。

0
2
1

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
2