質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

0回答

936閲覧

includesで取得した結果がnilになる

pecchan

総合スコア592

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2020/06/16 03:16

編集2020/06/17 23:06

こちらで回答いただき
初めてincludes出来るようになりました。

ですが取得結果がnilになりました。

どうしてnilになるのか、内部でどのように動作しているのか分かりません。
分かる方教えていただけないでしょうか?

ちなみに.includes(:items).allを外すとn+1問題になりますがnilにはなりません。

SubCategory モデル

ruby

1class SubCategory < ApplicationRecord 2 has_many :items 3end

Item モデル

ruby

1class Item < ApplicationRecord 2 belongs_to :sub_category 3end

SubCategory コントローラ

ruby

1class SubCategoriesController < ApplicationController 2 3 def index 4 @sub_categories = SubCategory.where(category_id: params[:category_id]).includes(:items) 5 6 respond_to do |format| 7 # カテゴリ一覧から呼び出し 8 format.html do 9 end 10 11 # セレクトボックスから呼び出し 12 format.js do 13 render json: @sub_categories.select(:id, :name) 14 end 15 end 16 17 end 18 19end

SubCategory ビュー

ruby

1<% @sub_categories.each do |sub_category| %> 2 <p><%= link_to sub_category.name, items_path(search: {sub_category_id: sub_category.id}) %> <%= "(#{sub_category.items.count})" %></p> 3<% end %>

@sub_categoriesがnilのためビューの1行目でエラーになります。
「undefined method `each' for nil:NilClass」

2020/06/17追記
SubCategoryにアクセスした時のログ(allは外しました)

log

1Started GET "/sub_categories/1" for 58.13.43.197 at 2020-06-17 14:04:53 +0000 2Cannot render console from 58.13.43.197! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255 3Processing by SubCategoriesController#index as HTML 4 Parameters: {"category_id"=>"1"} 5 Rendering sub_categories/index.html.erb within layouts/application 6 Rendered sub_categories/index.html.erb within layouts/application (2.4ms) 7Completed 500 Internal Server Error in 11ms (ActiveRecord: 0.3ms) 8 9 10 11ActionView::Template::Error (undefined method `each' for nil:NilClass): 12 1: 13 2: <% @sub_categories.each do |sub_category| %> 14 3: <p><%= link_to sub_category.name, items_path(search: {sub_category_id: sub_category.id}) %> <%= "(#{sub_category.items.count})" %></p> 15 4: 16 5: <% end %> 17 18app/views/sub_categories/index.html.erb:2:in `_app_views_sub_categories_index_html_erb___733152297473355794_70113344435740' 19

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

winterboum

2020/06/16 11:03

all外してみてください。
pecchan

2020/06/16 23:57

有難う御座います。 all外しましたが同じでした。 viewの1行目でnilエラーになりました。
winterboum

2020/06/17 01:16

よもや、とはおもいますが、whereとincludesを入れ替えてみてください。 それでもだめでしたら、logに発行されたSQLが出力されるので、それを載せてください
pecchan

2020/06/17 01:32

度々お付き合いいただき有難う御座います。 allありなしで入れ替えましたが同様の結果でした。 logを確認したところSQLが発行されていませんでした。 @sub_categories = SubCategory.where(category_id: params[:category_id]).includes(:items).all の行です。 なので@sub_categoriesがnilのままだったようです。 入れ替えない、入れ替える両方ともSQLが発行されてませんでした。
pecchan

2020/06/17 01:33

includesしない以下のパターン SubCategory.where(category_id: params[:category_id]) ですとlogにSQL発行されビューで表示されました。
winterboum

2020/06/17 13:27

いずれにせよ、allは不要です。有っても影響ないだろうとは思うのですがなんかあると嫌ですのでけしておきましょう。 で、SQLが発行されていませんか。エラーでも無いですよね。 その辺りのlog載せてください(allを消してから)
pecchan

2020/06/17 14:14

度々有難う御座います。 allは外しました。 ログ追記させていただきました。 where,indcludes入れ替えてもログは同じでした。
winterboum

2020/06/17 22:53

はて、、、、 念の為 index actionを全部載せてください
pecchan

2020/06/17 23:06

失礼しました。 indexアクションを全て記載しました。
winterboum

2020/06/17 23:36

わからん。。。 indexの先頭に有るんですね、なのになぜSQL発行されないのか??? 申し訳ない、お手上げです
pecchan

2020/06/18 00:16

とんでもないです。 お付き合い頂きとても感謝してます。 n+1問題はありますが、includes無しで動作させようと思います。 有難う御座います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問