こちらで回答いただき
初めて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
all外してみてください。
有難う御座います。
all外しましたが同じでした。
viewの1行目でnilエラーになりました。
よもや、とはおもいますが、whereとincludesを入れ替えてみてください。
それでもだめでしたら、logに発行されたSQLが出力されるので、それを載せてください
度々お付き合いいただき有難う御座います。
allありなしで入れ替えましたが同様の結果でした。
logを確認したところSQLが発行されていませんでした。
@sub_categories = SubCategory.where(category_id: params[:category_id]).includes(:items).all
の行です。
なので@sub_categoriesがnilのままだったようです。
入れ替えない、入れ替える両方ともSQLが発行されてませんでした。
includesしない以下のパターン
SubCategory.where(category_id: params[:category_id])
ですとlogにSQL発行されビューで表示されました。
いずれにせよ、allは不要です。有っても影響ないだろうとは思うのですがなんかあると嫌ですのでけしておきましょう。
で、SQLが発行されていませんか。エラーでも無いですよね。
その辺りのlog載せてください(allを消してから)
度々有難う御座います。
allは外しました。
ログ追記させていただきました。
where,indcludes入れ替えてもログは同じでした。
はて、、、、
念の為 index actionを全部載せてください
失礼しました。
indexアクションを全て記載しました。
わからん。。。
indexの先頭に有るんですね、なのになぜSQL発行されないのか???
申し訳ない、お手上げです
とんでもないです。
お付き合い頂きとても感謝してます。
n+1問題はありますが、includes無しで動作させようと思います。
有難う御座います。
あなたの回答
tips
プレビュー