【问题标题】:Rails ORM query resultsRails ORM 查询结果
【发布时间】: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


【解决方案1】:

您可以在应用程序中添加子弹 gem,它会提示 n+1 个查询

在你的应用程序中添加这个 gem

gem "bullet", :group => "development"

在您的配置文件 config/environments/development.rb 中添加以下设置

config.after_initialize do
  Bullet.enable = true
  Bullet.alert = true
  Bullet.bullet_logger = true
end

之后您应该能够监控 n+1 个查询

更多参考可以在下面的链接中查看

https://github.com/flyerhzm/bullet

【讨论】:

    猜你喜欢
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多