【发布时间】:2014-06-27 13:44:20
【问题描述】:
为什么 Ruby on Rails 框架不提供一种方法来了解我正在执行的操作是否会导致查询?
获取一个拥有许多帖子的用户
在我看来我会这样做:
<% @user.posts.each do |p| %>
<%= p.title %>
<% end %>
我无法查看我是否在控制器中这样做了
@user = User.find(params[:id]).includes(:posts)
这是一个急切的加载,并导致一个查询,带有左连接,或者如果我这样做了:
@user = User.find(params[:id])
导致 n+1 个查询
如果应用程序很简单,不会有任何问题,但让我们来一个更大的应用程序。 也许查询方法不在控制器中,而是在模型中。也许它甚至不在模型中,而是在一个关注点中(一个外部模块,包括我的模型)。
换句话说,我的印象是框架对我的数据库所做的事情失去了控制。
你找到解决这个问题的方法了吗?
【问题讨论】:
-
您可以在您的应用程序中添加子弹 gem,它会提示 n+1 个查询
-
实际上,
includes不会导致一个左连接查询,而是两个查询。 guides.rubyonrails.org/… -
你也可以使用这个 gem 来帮助你:github.com/flyerhzm/bullet
-
我知道子弹宝石,但这还不够。我不想要诊断,我想要结构化的工作方法。诸如“将所有查询结果放在一个数组中,这样我就不能透明地调用数据库”之类的东西。一个框架应该提供解决非常常见问题的方法,我不敢相信这不是一个常见的问题。
标签: ruby-on-rails database ruby-on-rails-4