yujiroのプログラミング

勉強内容をアウトプットし、サボらないようにする為のブログ

<DAY118>アソシエーションのデーター取得について

\ Follow me!! /

●学習日数 118日

●学習時間(本日)11時間
●累計学習時間 596.5時間

●一日あたりの平均学習時間 5.05時間

問題となったケース

  • 外部キーを元に子データーの要素を取得する場合

結論。eachの中にeachをかける必要がある。

テーブルの概要

  • 親 itemsテーブル
  • 子 item_imagesテーブル

imageカラムを持つ。

1アイテムに何枚かの写真がひもづく事から1対多の関係である。

定義したコード

itemsコントローラーにて以下のように定義する

@ items = Item.all 

表示したいviewに以下のように表示してみた
haml

= @items.each do |item|
  item.item_images.image

このように定義するとnoメソッドエラーとなる。

流れの整理

重要なのは、どのような形でデーターが格納されているのかを整理する事

確認その1

モデル通じてデータを取得した場合。
こんな形でデーターが入っています。

[
    #<Item id: 1, name: "あ", created_at: "2019-06-10 08:21:50", updated_at: "2019-06-10 08:21:50"
  ,#<Item id: 2, name: "い", created_at: "2019-06-10 08:21:50", updated_at: "2019-06-10 08:21:50",
]

確認その2

アソシエーションを用いて、データーを取得した場合はどうか?
eachにて配列データーを1づつ取り出して、表示する.

具体的には、item.item_images.imageとする場合
配列から取り出しているのに、配列になっている!

 [#<ItemImage:0x00007fefe401b068 ←これが、配列で取り出された情報(なぜか配列に格納)

#これ以下がアソシエーションで取得した情報
  id: 1,
  image: "https://notissary.net/media/2018/10/genbaneko-e1540364459576.jpg",
  item_id: 21,
  created_at: Mon, 17 Jun 2019 08:35:55 UTC +00:00,
  updated_at: Mon, 17 Jun 2019 08:35:55 UTC +00:00>]

確認その3

配列を解除してため、もう一度eachをかけてあげる。
他にもやり方がありそうだが、今はこの形しか思いついていない。
この形で子要素のデータが取得できた。

@items.each do |item|
  item.item_images.each do |image|
  image.image
  end
end