0

Outlet.rb :

def latest_reports
  weekly_reports.limit(10)
end

Outlet_controller.rb :

@all_outlets = Outlet.includes(:weekly_reports)
@search = @all_outlets.search(params[:q])   # load all matching records
@outlets = @search.result.order("created_at DESC").page(params[:page])

アウトレット/index.slim :

- @outlets.each do |outlet|
  tr
    td= link_to outlet.name, outlet_path(outlet)
    th
      ul.reports
        li class="#{'done' if outlet.monitored_today}"
    th
      ul.reports
        - for report in outlet.latest_reports
          li class="#{'done' if report.quota_met}"= report.times_monitored

理由はわかりませんが、これにより、いくつかの異なるクエリとして読み込まれます。コントローラーのインクルードが正しくないためだと確信しています(モデルでメソッドを使用しているため)。

誰かがこれを改善するのを手伝ってくれるなら、私は非常に感謝しています:)。

注:私はPostgreSQLで開発しています

更新: : 完全なコントローラー アクションを投稿しました。

4

1 に答える 1

2

少なくともRails 3では、使用する場合

Model1.includes :model2

結果はモデルごとに 1 つのクエリになります。結果から関連付けられたモデルのインスタンスにアクセスでき、余分なクエリは行われません。

すべてを 1 つのクエリにまとめたい場合は、次のようにします。

Model1.joins(:model2).includes(model2)

これにより、両方のモデルのすべてのデータを一度にロードする長い JOIN クエリが生成されます。Rails は、すでにロードされている両方のモデルのインスタンスを結果に取り込みます。

だから、あなたは交換できるはずです

@all_outlets = Outlet.includes(:weekly_reports)

@all_outlets = Outlet.includes(:weekly_reports).joins(:weekly_reports)

すべてを 1 つのクエリに結合する必要があります。

于 2012-04-27T12:07:44.370 に答える