1

私は以下のような4つのモデルを持っています

  • ユーザー (1 つのプロファイル、多くのコミュニティ、および多くのコードを持つ)
  • プロファイル (ユーザーに属します)
  • コミュニティ (多くのコードがあり、ユーザーに属します)
  • コード (コミュニティとユーザーの両方に属します)

code現在、特定のコミュニティに属するの 10 件のレコードを表示しようとしています。

これcodeには、次のような外部テーブルの情報が含まれます

  • username(in user table)
  • comment(in profile table)
  • point(in profile table)

現在、熱心な読み込みを使用していないため、多くの SQL クエリを発行しています。
この場合、読み込み速度を速くするためにコードをカスタマイズして、この熱心な読み込みを行うにはどうすればよいですか?

controllers/communities_controller.rb

#CanCan load_and_authorize_resouce
load_and_authorize_resource :find_by => :community_name,

models/community.rb

belongs_to :user
has_many :codes

models/code.rb

belongs_to :user, counter_cache: true
belongs_to :community, counter_cache: true

scope :recent, lambda { |n = 10| includes(:user).where('users.deleted_at' => nil).order("users.last_active_at DESC").limit(n) }

models/user.rb

has_one :profile
has_many :communities
has_many :codes

models/profile.rb

belongs_to :user

ビュー/コミュニティ/show.html.erb

<% @community.codes.recent.each do |code| %>
    <%= render 'codes/code', {:code => code, :icon_photo => code.user.profile.user_avatar} %>
<% end %>

ビュー/コミュニティ/_code.html.erb

<tr>
    Username: <%= code.user.username %> <br />
    Code: <%= code.data %> <br />
    Comment: <%= code.user.profile.comment %> <br />
    Point: <%= code.user.profile.point.to_s %>
</tr>
4

1 に答える 1

1

特に複雑にする必要はありません.includes。熱心にロードしたいすべてのビットだけ..

@community.codes.recent.includes(user: :profile)

また、Communityのコードは常にすべての のコードと同じUserですか? その場合、 でhas_many :codes, through: :users関連付けを使用する必要がありますCommunity

于 2013-08-29T11:08:45.377 に答える