【Rails】配列の中で異なる配列に合致する要素を表示

こんにちは、daissh04です。

Railsの勉強を初めて約半年になりますが初めてブログ書きます。

知識至らぬ点多々あると思いますが、もっといいやり方等あれば

ご指摘、コメントください。

 

プログラミングスクールの最終課題でフリマアプリを熱烈作成中です。

そこで実装に困ったことを中心に備忘録としてブログに残して行きたいと思います

 

【概要】

この記事ではフリマアプリのトップページにて、カテゴリ毎に商品を表示したい。

のやり方について説明します

 

例えば下記画像のようにレディース欄にはitemテーブルのcategory_idがレディース系のIDを持っているitemのみ表示するといった具合です。

f:id:daissh04:20200222041705j:plain

⬆️レディースの欄には

f:id:daissh04:20200222041924p:plain

⬆︎category_idがレディース系のitemを表示

f:id:daissh04:20200222042130p:plain

この記事では詳しく触れませんがカテゴリは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に格納します

@item = Item.new
@items = Item.all

そしてレディース系のカテゴリを持つ商品を@ladies_grandchildに格納します

@ladies = Category.find(1)
@ladies_grandchild = @ladies.indirects

indirectsはancestryが持つメソッドで指定した親が持つ孫要素を全て抽出するという超便利メソッドです。

ancestryは色々なメソッドがあるので調べてみて下さい。

 

やりたいことは、

全アイテムの@itemsの中で、cateogry_idが@ladies_grandchildのcategory_idとイコールのitemのみ表示することです。

 

私は何の疑いもなく下記のようにコードしました

- @items.order('created_at DESC').each do |item|
- if item.category_id == @ladies_grandchild.id

頭に描いていたのはitemのcategory_idとレディース系のidがイコールにあるものを表示

することでしたがうまくいきませんでした。

 

ここで理由がわからず、サイトやチームメンバーと議論したところ、@ladies_grandchildrenが配列のままであり、中の要素まで比較できてないのでは?という指摘でした。

コントロールにbinding.pryを入力し、データを調べると

gyazo.com

 

5行目のに [  で始まってます。今更ですが、Railsのハッシュをもつ複数のデータを格納させると連想配列として格納されます。

 

つまり連想配列である@ladies_grandchildに@ladies_grandchild.idとしても取得できな訳です。

 

基本に帰ります。配列の中の要素を抽出したい時はeachです。 

- @items.order('created_at DESC').each do |item|
-@ladies_grandchild.each do |lady|
- if item.category_id == lady.id

 

@itemsはeachで展開されているので、eachの中にさらにeachでバラしてみました。

そうするとうまく表示することができました。

 

@itemsの数だけさらに@ladies_grandchildをeach展開しているので、レスポンスが心配でしたが、一応やりたいことはできました。

 

ただ、出品数が増えるとレスポンスの影響が必ず出るので、ほかのやり方調べてます。

 

参考書で配列はeachで展開すると頭では知ってたのですが、いざ実装し変化球でくるとそこまで頭で辿りつけませんでした。

 

アウトプットが大事って言われるのはそういう気づきの為かもしれませんね、

まだまだ頑張ります。

 

だらだらと書いて申し訳ありません。最後までお付き合いありがとうございました