Rails 【モデル】リレーションでView側にもUserNameを表示してみた
views/microposts/index.html.erb
<% @microposts.each do |micropost| %> <%= micropost.content %> <%= micropost.user_id %> <%= micropost.user.name %> ← コレ追加 <%= link_to 'Show', micropost %> <%= link_to 'Edit', edit_micropost_path(micropost) %> <%= link_to 'Destroy', micropost, method: :delete, data: { confirm: 'Are you sure?' } %> <% end %>
無事表示されたけど…
logをみてると1レコード毎にselect文を発行してUserデータを取得してるやん!
Processing by MicropostsController#index as HTML Micropost Load (0.1ms) SELECT "microposts".* FROM "microposts" User Load (0.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1 User Load (0.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = 2 LIMIT 1 Rendered microposts/index.html.erb within layouts/application (3.5ms) Completed 200 OK in 9ms (Views: 7.7ms | ActiveRecord: 0.4ms)
これではレスポンスが悪くなるので修正
試してみる!
まずは、find_by_sqlを使ってみる
早くなった!
でも、なんかクエリ書くのイヤwww
Railsリファレンス(Active Record Query)を見てみると…
includesメソッドなるものが!
標準ではリレーションデータは後読みらしい(なんでか知らんが…)
controllers/microposts_controller.rb
def index #@microposts = Micropost.all @microposts = Micropost.includes(:user) ← こんな感じに修正 respond_to do |format| format.html # index.html.erb format.json { render json: @microposts } end end
Processing by MicropostsController#index as HTML Micropost Load (0.1ms) SELECT "microposts".* FROM "microposts" User Load (0.1ms) SELECT "users".* FROM "users" WHERE "users"."id" IN (1, 2) Rendered microposts/index.html.erb within layouts/application (3.9ms) Completed 200 OK in 8ms (Views: 7.9ms | ActiveRecord: 0.3ms)
うん、レスポンスが良くなったが…
IN句でクエリー2つ走ってるのがなんか納得いかんなー(´・ω:;.:...
0 件のコメント:
コメントを投稿