2012年9月11日火曜日

Rails ActiveRecord Query

( ̄(エ) ̄)彡☆

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 件のコメント:

コメントを投稿