Rails 5,@ child.parent,N + 1 bullet

时间:2016-08-27 02:07:20

标签: sql ruby-on-rails ruby ruby-on-rails-4 rails-activerecord

Rails 5。

新应用,全部默认。

子弹宝石告诉我:

user: root
/children/2
N+1 Query detected
  Child => [:parent]
  Add to your finder: :includes => [:parent]
N+1 Query method call stack
  app/controllers/children_controller.rb:14:in `show'
app/controllers/children_controller.rb:14:in `show'

我有这些模型

class Parent < ApplicationRecord

    has_many :children

end

class Child < ApplicationRecord

    belongs_to :parent

end

我在 children_controller.rb 中有这个控制器:

...

def show
    @parent = @child.parent
end
...

在我的观点中 views / children / show.html.erb 我有这个:

...
<%= @parent.name %>
...

如果我将其反转并在视图中我放了:

<%= @child.parent.name %>

并在控制器中:

...

def show
    #nothing more
end
...

我在Bullet中遇到了同样的错误,但在html中。

如何解决这个问题?真的是N + 1问题还是子弹错了?

这个项目真的很新。第一个模型。

1 个答案:

答案 0 :(得分:2)

我不认为它是一个N + 1问题,因为一个孩子只有一个父母。但是,您可以使用包含,如果这有所不同:

@child = Child.includes(:parent).find(1)

但是如果你在终端上尝试两种方法,你会看到ActiveRecord生成了2个包含和不包含的SQL语句。