【Rails】配列の中で異なる配列に合致する要素を表示
こんにちは、daissh04です。
Railsの勉強を初めて約半年になりますが初めてブログ書きます。
知識至らぬ点多々あると思いますが、もっといいやり方等あれば
ご指摘、コメントください。
プログラミングスクールの最終課題でフリマアプリを熱烈作成中です。
そこで実装に困ったことを中心に備忘録としてブログに残して行きたいと思います
【概要】
この記事ではフリマアプリのトップページにて、カテゴリ毎に商品を表示したい。
のやり方について説明します
例えば下記画像のようにレディース欄にはitemテーブルのcategory_idがレディース系のIDを持っているitemのみ表示するといった具合です。
⬆️レディースの欄には
⬆︎category_idがレディース系のitemを表示
この記事では詳しく触れませんがカテゴリはRailsのgem ancestryを使用しています。
上画像のようにNullクラスが親、1桁のカテゴリはその子、親/子は孫といった具合に多階層の関係をもつことができます。
レディース系のカテゴリというのは、レディースを親にもつ全カテゴリという訳です。
ancestryについては以下の記事を参考にしました。
参考記事:
https://qiita.com/Sotq_17/items/120256209993fb05ebac
https://qiita.com/ATORA1992/items/bd824f5097caeee09678
https://qiita.com/ATORA1992/items/03eb78e212080072ab9f
【詳細】
まずはトップメニューに表示する全商品を@itemsに格納します
そしてレディース系のカテゴリを持つ商品を@ladies_grandchildに格納します
indirectsはancestryが持つメソッドで指定した親が持つ孫要素を全て抽出するという超便利メソッドです。
ancestryは色々なメソッドがあるので調べてみて下さい。
やりたいことは、
全アイテムの@itemsの中で、cateogry_idが@ladies_grandchildのcategory_idとイコールのitemのみ表示することです。
私は何の疑いもなく下記のようにコードしました
頭に描いていたのはitemのcategory_idとレディース系のidがイコールにあるものを表示
することでしたがうまくいきませんでした。
ここで理由がわからず、サイトやチームメンバーと議論したところ、@ladies_grandchildrenが配列のままであり、中の要素まで比較できてないのでは?という指摘でした。
コントロールにbinding.pryを入力し、データを調べると
5行目のに [ で始まってます。今更ですが、Railsのハッシュをもつ複数のデータを格納させると連想配列として格納されます。
つまり連想配列である@ladies_grandchildに@ladies_grandchild.idとしても取得できな訳です。
基本に帰ります。配列の中の要素を抽出したい時はeachです。
@itemsはeachで展開されているので、eachの中にさらにeachでバラしてみました。
そうするとうまく表示することができました。
@itemsの数だけさらに@ladies_grandchildをeach展開しているので、レスポンスが心配でしたが、一応やりたいことはできました。
ただ、出品数が増えるとレスポンスの影響が必ず出るので、ほかのやり方調べてます。
参考書で配列はeachで展開すると頭では知ってたのですが、いざ実装し変化球でくるとそこまで頭で辿りつけませんでした。
アウトプットが大事って言われるのはそういう気づきの為かもしれませんね、
まだまだ頑張ります。
だらだらと書いて申し訳ありません。最後までお付き合いありがとうございました