<DAY118>アソシエーションのデーター取得について
●学習日数 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