Ruby on rails 从嵌套的分部文件中进行即时加载

Ruby on rails 从嵌套的分部文件中进行即时加载,ruby-on-rails,ruby-on-rails-4,eager-loading,partials,Ruby On Rails,Ruby On Rails 4,Eager Loading,Partials,gem项目符号表示,当为加载到页面的每个餐食品加载餐食品时,我有一个N+1错误。让我解释一下 在我的rails应用程序中,有一些嵌套的片段被呈现为: 膳食>餐食 所以会呈现多顿饭,然后对于呈现的每顿饭,也会在其中呈现相应的餐食(如果有的话) 这是代码 用餐/演出期间: <% if @meals != nil %> <%= render(partial: "meal", collection: @meals) %> <% else %> <p

gem项目符号表示,当为加载到页面的每个餐食品加载餐食品时,我有一个N+1错误。让我解释一下

在我的rails应用程序中,有一些嵌套的片段被呈现为:

膳食>餐食

所以会呈现多顿饭,然后对于呈现的每顿饭,也会在其中呈现相应的餐食(如果有的话)

这是代码

用餐/演出期间:

<% if @meals != nil %>
   <%= render(partial: "meal", collection: @meals) %>
<% else %>
   <p style="text-align:center">No meals created yet.</p>
<% end %>  
具体错误:

N+1 Query detected
  Meal => [:meal_foods]
  Add to your finder: :include => [:meal_foods]
N+1 Query method call stack
/app/views/meals/_meal.html.erb:23:in 
此错误所指向的行是_mine.html.erb partial.的渲染行

有趣的是,如果我将earger加载包含在该部分子弹中,则会出现错误“未使用的急切加载!”,并且第一个食物中的餐食也会错误地转入其余的餐食中

此方法如下所示:

在_dine.html.erb中

<tbody>
  <% mf = MealFood.includes(:meal) %>
  <%= render(partial: "meal_foods/meal_food", collection: mf) %>
</tbody>


将您的
@founds
变量更改为
当前的\u客户端。founds.includes(:found\u food)
。正如@artimees所说的那样,这会加载数据并阻止n+1查询。它之所以有效,是因为@Founds without.includes(:found\u food)运行1个查询来获取餐食。。。并且在每一部分(这一行特别是fine.fine\u foods)中,它为您的每顿饭运行一个查询。。。因此,如果您有n顿饭,则运行1个查询来获取所有的饭,并运行n个查询来获取每顿饭。。。如果您使用includes(:fine\u food),它只运行一个优化查询,以加载膳食关系的膳食…

@fines
变量更改为
当前客户端.fines.includes(:fine\u food)
,因为
@fines
没有
.includes(:fine\u food),所以它起作用了
运行
1
查询以获取膳食。。。在每一部分中(这一行特别是
一餐.一餐食物
),它会对你吃的每一餐运行一个查询。。。因此,如果您有
n
顿饭,您可以运行
1
查询来获取所有顿饭,并运行
n
查询来获取每顿饭。。。如果使用
includes(:meat\u food)
它只运行一个优化的查询,以获取加载了它们的餐食关系的餐。。。请等待@CWitty写出答案并标记为:dohh。。它在一个查询中检索每一餐及其相应的餐食?很酷。还有,为什么我的评论被删除了?科维蒂首先回答了这个问题,这是值得称赞的。我想无论是谁用这些信息来正式回答我的问题都会得到信任。不@CWitty才是值得信任的人。我现在就加上它,谢谢:)哥们,来吧。。。抄解释,得到你应得的证明。
def show
  @meals      = current_client.meals    
  @new_meal   = current_client.meals.build
end 
N+1 Query detected
  Meal => [:meal_foods]
  Add to your finder: :include => [:meal_foods]
N+1 Query method call stack
/app/views/meals/_meal.html.erb:23:in 
<tbody>
  <% mf = MealFood.includes(:meal) %>
  <%= render(partial: "meal_foods/meal_food", collection: mf) %>
</tbody>