Ruby on rails ActiveRecord何时运行查询?

Ruby on rails ActiveRecord何时运行查询?,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我对ActiveRecord何时运行它的查询很感兴趣,因为我记得读到Rails会优化查询,直到使用实际数据时才执行查询,我只是不确定如何证明这一点或在文档中找到它。我不能只在rails控制台中运行这些行,因为当我输入查询时,它会显式地运行查询。我将在下面解释我的意思: @stores = Store.where(active: true) # Query should not have ran yet @stores = @stores.includes(:owners) # Query sh

我对ActiveRecord何时运行它的查询很感兴趣,因为我记得读到Rails会优化查询,直到使用实际数据时才执行查询,我只是不确定如何证明这一点或在文档中找到它。我不能只在rails控制台中运行这些行,因为当我输入查询时,它会显式地运行查询。我将在下面解释我的意思:

@stores = Store.where(active: true)
# Query should not have ran yet

@stores = @stores.includes(:owners)
# Query should not have ran yet

@stores.each { |store| store.do_something }
# So from this point forward, it should run
# Store.includes(:owners).where(active: true) all at once
# or it would have ran 3 queries instead of one.

我如何证明这一点,或者有人能引导我找到正确的文档

虽然我知道Rails会推迟执行查询,直到它们真正需要时才执行,但我在文档中没有谈到这一部分。为了计算出运行了多少个db查询,我使用RSpec测试中调用的这个gem进行实验

在你的情况下,我会做类似的事情:

it 'experiment 1' do
  expect { @stores = Store.where(active: true) }.to make_database_queries(count: 0..3)
end

it 'experiment 2' do
  expect do 
    @stores = Store.where(active: true) 
    @stores = @stores.includes(:owners)
  end.to make_database_queries(count: 0..3)
end

it 'experiment 3' do
  expect do 
    @stores = Store.where(active: true) 
    @stores = @stores.includes(:owners)
    @stores.each { |store| store.do_something }
  end.to make_database_queries(count: 0..3)
end

通常,当您尝试通过
find
each
等方法访问数据时,它会执行查询。我找不到这些方法的最终列表。我相信经验法则是要知道你调用的方法是返回一个活动记录还是一个关系。计算查询的有趣方法。我一直在尝试在rails服务器日志中计算它们。在开发环境中是否有方法对它们进行计数或为以后的输出分配查询计数?不确定,它是RSpec的匹配器,因此它更适合于测试环境,而不是开发环境。我猜它可以公开吗?