0

出口.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

那么结果是每个模型的一个查询。您可以从结果中访问关联模型的实例,并且不会进行额外的查询。

如果您真的想在一个查询中完成所有操作,可以执行以下操作:

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

这将产生一个很好的长 JOIN 查询,一次加载两个模型的所有数据。Rails 将使用已加载的两个模型的实例填充结果。

所以,你应该可以更换

@all_outlets = Outlet.includes(:weekly_reports)

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

它应该将所有内容组合到一个查询中。

于 2012-04-27T12:07:44.370 回答